背景

周五中午,烈日当空。

在组织活动要求下,我和几位同事顶着大太阳去参观了章太炎故居,并在附近开了个会。

搭同事顺风车回到公司,下车的时候,有点晕的我感慨了一句:“中午不睡,下午崩溃。”

没想到说完这句话,我收到了一个问题反馈:某个页面的某个功能区块,用户点击了没反应。

并且配套的还有程序员经典名言:我这里是好的。

初步分析

预期情况:用户点击区块a,会根据服务端下发的url进行页面跳转。

此时用户点击后没有反应,又由于开发该页面的同学未在此处代码逻辑中添加相应日志,所以先从服务端返回的url格式是否合法开始排查。

经过一番尝试复现问题(但失败)的排查,有以下两个结论:

  • 在相同的手机设备、手机系统和应用版本上,在用户侧点击区块a没反应 —— 在我们这里是好的。[代码运行逻辑和环境]
  • 在相同的测试账号和页面数据条件下,在用户侧点击区块a没反应 —— 在我们这里是好的。[代码操作数据]

这时候就有点纳闷了,因为通常 result = op_code + op_data。然而此处在我们判断op_code 和 op_data一致的情况下,result竟然不同,会是哪里有问题呢?

在纳闷的同时,也觉得这个问题真有趣。

进一步分析

我找了用户做进一步了解,得知在同一个页面内,点击另一个区块b是可以跳转的。

那么,在同一个页面里,运行环境是一样的,区块a和区块b的点击响应逻辑有什么不同呢?

对此,我梳理了下逻辑时序:

用户的点击操作是上图第⑤步,然后在第⑧步没有走通。

由于这个问题是在版本发布前夕反馈的,也有时间点压力。如果临时发一个补充日志的版本只是为了定位问题的话,那显然不是我们想要的。

于是我从第⑤步到第⑧步逐一分析:

  • 需要确定第⑥步callback是有回调的,对应的就有之前注册事件回调的地方是有执行成功的。
  • 需要确定第⑦步 event handler中对两个参数的校验是否通过:
    • url是否合规,是否会由于系统兼容性而实例化失败。
    • context是否有效。
  • 需要确定第⑧步是否走到url router中。

由于在点击b区块时,并没有对url和context参数做校验,所以我重点看了下第⑦步 event handler对这两个参数的校验:

  • 对于url参数:

    • 点击b区块发生跳转时的url不依赖服务端下发,这点有区别。
    • 但在初步分析时的运行环境对比可以基本排除该参数的问题。
    • 如果真有问题也可以做动态修复,不依赖发版,因为是服务端下发的。
  • 对于context参数:
    • 是在render时作为参数传递给engine的。
    • 点击b区块没有对context参数做校验。考虑也把点击a区块时的context参数校验判断去掉,但需要考虑后续链路的参数依赖性,避免为了解决一个问题而引入另一个问题。
    • 此时身边有同事提了一句:他之前遇到过异步获取context时,engine返回了空对象。

这是一句“曙光乍现”的话语,但没想到把我带偏了一波。

就在我被带偏的时候,测试同学把问题给复现出来了 —— 之前他们也一直尝试但却无法复现。

原来用户是点击了服务端动态下发的Button 2 进入的Page A,而我们一直是点击大区块Info Area进入的。由不同的入口进入Page A时携带的参数有差异导致的:从Button 2点击进到Page A没有传context参数。

总结

  1. 从广义单一原则来看,从Page List进入Page A的代码逻辑应该统一收口。之前由于服务端的动态下发特性,以及不同点击事件上engine回调的event handler有较大差异,导致有分叉。
  2. 关键性节点应该有异常日志。
  3. 接口和类的声明定义需要清晰和严谨。比如Page B,一方面应该声明清楚必备参数,另一方面在发现必备参数缺失时,应该直接返回异常结果让调用方明确感知到。
  4. 在重构代码进行调优时,需要更严谨地去看上下游依赖。比如此处原本是正常运行的,但同事在对Page B代码逻辑进行优化时,删除了原本一处获取context的兜底逻辑,为了让问题代码更早暴露、避免兜底逻辑太多了后续更难维护 —— 发展到好比一个人有抽烟喝酒熬夜各种不健康生活习惯但仍然活到了100岁,医生说你就继续这样过吧,我也不敢给你什么建议。
    1. 这里更好的做法是,做好第3点。
    2. 根据删除的兜底逻辑去检查有哪些上游调用节点是会被影响到的。
    3. 虽然有加了断言,但在子模块release工程环境中发挥不出作用。

最后,也是最重要的,开发者需要对代码有敬畏和信心,当我们排除了种种不可能,那我们就能找到问题的真相。这也是很有乐趣的。

When you have eliminated the impossibles, whatever remains, however improbable, must be the truth.

记一次页面区块点击无反应的问题排查相关推荐

  1. Lodop插件未安装 页面卡死 点击无反应

    问题背景: pc项目使用到Lodop打印 问题: 点击打印,LodopFuncs.js 会首先检查是否安装了Lodop插件,只要未安装Lodop,页面头部会进行提示,提示过后,页面的其他操作都无任何响 ...

  2. android 跳转页面出错,Android 页面跳转(无/含有返回结果)

    一.两个页面的xml文件 factivity android:layout_width="match_parent" android:layout_height="wra ...

  3. Selenium:动态页面模拟点击

    Selenium:动态页面模拟点击 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Sel ...

  4. layui form表单点击无反应

    无刷新页面再次操作form表单 时,点击无效果 重点来了!解决方法!需要form.render(); 代码如下: <script>layui.use('form', function(){ ...

  5. JS获取页面鼠标点击位置的坐标

    本来想通过JS实现当前页面对其他页面的操作,在网上发现了这段js代码,先保存下来,可以获取页面鼠标点击位置的坐标. <html> <body> <script> f ...

  6. easyui的下拉框combobox在包含的iframe页面里点击不能收回解决办法

    此处下拉框不能收回是因为iframe是新页面,点击事件不能传递到父级页面.我们需要在父级页面监听iframe页面的点击事件,进而操作下拉框的动作: 以下是获取iframe的js: var iframe ...

  7. 电脑无规律无响应,鼠标能动但是点击无反应一直在转圈。

    电脑无规律无响应,鼠标能动但是点击无反应一直在转圈. 重装系统后,问题仍旧,推测是硬件问题,除了硬盘外电脑全部更换,问题仍旧,应该是硬盘问题,换了硬盘,装下系统,问题不在,用段时间继续观察.

  8. H5页面苹果手机点击输入框输入内容时 页面自动放大

    问题:H5页面苹果手机点击输入框输入内容时,页面会自动放大,导致用户体验不好 解决:<meta name="viewport" content="width=dev ...

  9. 百度站长平台"添加站点"提示"您无权访问该页面,点击确定按钮返回首页?"

    大家在百度站长平台"添加站点"."抓取诊断"的时候,是否遇到"您无权访问该页面,点击确定按钮返回首页"问题.小编也遇到过这种情况,现在问题已 ...

最新文章

  1. mongo在哪创建管理员_MongoDB初始化创建管理员账户登录
  2. 利用kickstart实现pxe自动安装linux
  3. setHasOptionsMenu
  4. python编程入门指南怎么样-Python 应该怎么学?
  5. vaadin教程_Vaadin教程
  6. 8个超震撼的HTML5和纯CSS3动画源码
  7. 第二十五期:搞定Linux Shell文本处理工具,看完这篇集锦就够了
  8. CodeForces - 888C K-Dominant Character 思维
  9. 多方法调用 一个出错 集体回滚_一个@Transaction哪里来这么多坑?
  10. 调用discuz编辑器发布帖子显示html代码的解决办法
  11. 你所能用到的数据结构之番外篇---逆袭的面向对象(一)
  12. 数组的 sort() 方法详解
  13. java函数命名规范_java命名规范
  14. 记一次代码重构--状态机编程
  15. 什么是业务模式、商业模式、经营模式、盈利模式和发展模式?
  16. netbeans莫明其妙的报错
  17. 黑客张福:互联网是黑暗的森林
  18. Collections.sort()方法对象排序
  19. OSI七层网络、TCP/IP五层网络架构、二层/三层网络
  20. java: 关于反射

热门文章

  1. 是什么让文档管理软件(DMS)用户友好?
  2. Vue和Nvue区别
  3. android手机连接PC无法正常安装驱动
  4. 数字图像处理Python实战--高斯拉普拉斯金字塔图像重建
  5. 测试开发知识点整理(二)
  6. 最大似然估计和最大后验概率估计的区别
  7. C#报错:未将对象设置到对象实例 Object reference not set to an instance of an object
  8. 陈老师深度为你解析,单片机的运行原理
  9. 按键精灵设置界面居中显示
  10. 互联网江湖录3——武当阿里