-
Notifications
You must be signed in to change notification settings - Fork 2.2k
如何排查问题
JSPatch 建了一个交流群,总结一下群里问的问题,主要分几类:
- 直接贴一坨代码说没效果,怎么回事。大部分是直接用 JSPatch Convertor 转换后没修改直接运行的。
- 文档可以搜到的问题,例如对swift支持怎样,带
_
下划线的方法怎么调用,stringWithFormat怎么调用等。 - 文档搜不到,但换种方式可以搜到或找到的问题,例如 NSClassFromString 怎么调用,JS 数组/字典对象问题等。
- 一些难以发现或排查的问题,例如block多次传递,死锁。
实际上只有第四种问题才是值得回答的,其他三种可以说是伸手党,对于这三种问题,希望可以通过这篇文档自行找到解决方法。
如果你直接运行用 JSPatch Convertor 转换出来的代码,多半是不会成功运行的。因为这个工具有一些特性不支持,例如宏/静态变量/枚举/私有变量等,在工具下方有说明支持的和不支持的特性。对于这些不支持的特性,需要人工修改,具体怎样修改,参见:
宏/静态变量/枚举
私有变量
C 函数调用
Struct支持
GCD调用
如果一个JSPatch脚本没有达到预期效果,怎样进行调试?
首先确定执行的脚本文件是正确的,可以在 JPEngine.m 的 -evaluateScriptWithPath: 方法里断点看看。
然后如果执行的 JS 脚本本身语法有问题,就会立即中 Assert (debug阶段crash,release阶段没事)。如果你debug 时看到 crash 提示 SyntaxError: Unexpected identifier …
,就是 JS 脚本语法有问题,一般会提示哪个位置有问题,根据它的提示排查就行了。也可以把整个脚本复制到 Chrome / Safari 的 console 控制台执行,有语法问题会立即提示错误。
JS 脚本语法没有问题后,接下来就是运行时错误,找不到变量,调用方法不存在之类,这些问题在 JSPatch 引擎里也设计成中 Assert。对这类问题的排查就跟平时写程序排查一样了,可以遵循以下步骤:
- 人肉看代码,看能不能直接看出问题,前提是大致看过 JSPatch 的文档,知道大概的一些规则,例如私有变量/静态变量不能直接拿,方法里的
_
要替换成__
等等。 - 如果找不到,就打log,在不同位置打log,先确定有没有执行到打log的位置,确定发生问题的代码段,缩小人肉看代码的范围。
- 如果有必要,就通过 safari 进行断点调试。
JS运行没问题,还是没效果,或者效果跟想象不一样,这时首先确定 JS 脚本替换的方法是不是在脚本执行之前就已经执行了,所以导致看到的效果是替换前的。其他问题就要查文档了。
经过调试后你知道了问题出在哪里,但不知道 JSPatch 对这个问题的处理和规则是什么,就先查文档。
可以通过google搜索这个项目的 wiki 文档和 issue 记录,像这样:
https://www.google.com.hk/search?q=私有变量%20site%3Agithub.com%2Fbang590%2FJSPatch
把其中的关键字 {私有变量} 替换成你想问的问题就可以了。大部分问题可以搜到答案,例如 stringWithFormat 怎么调用
,方法里有_下划线怎么替换
,swift 支持怎样
,webview有问题
,等等。有些问题如果搜不到答案可以尝试转换描述,例如 NSClassFormString() 这个函数怎么调
,可能搜不到答案,但这是个 C 函数,直接搜 C函数怎么调
就行了。
另外一些常见问题会放到这篇文档里,建议先看一下其中的 字符串 / 数组 / 字典 操作问题 和 for … in 这两节,这是被问得最多的问题。
如果上述步骤都尝试过仍没有解决问题,欢迎在群上提问。
提问前请确保自己进行过上述尝试,这样可以提出明确的问题,不会问“为什么没效果”,“这段代码有什么问题”这样伸手党的问题。可以描述自己做过哪些调试和尝试,具体哪里碰到了问题,同时带上足够的信息(代码 & 调试结果 & 崩溃堆栈)。
JSPatch报错信息:
- 如果你使用的是JSPatchSDK,JS代码发生错误大部分情况并不会崩溃,但是完全没有效果不生效,JSPatch会把错误信息打印在控制台进行输出,如果你控制台内容太多,太难寻找,你可以使用
[JPEngine handleException:^void(NSString *log){ }]
这个接口接管JSPatch报错信息,保存进行查看 - 如果你是用的是JSPatch源码,JS代码发生错误会第一时间断言崩溃,可以定位相应的崩溃堆栈,辅助查找问题
P.S. 如果你用的是 JSPatch 平台的 SDK,可以参照这篇文档。