在做报错日志的收集,cocos-lua有debug.traceback,很直观地看到报错的调用堆栈。但是creator的__errorHandler好像合并成一个JS文件,只能看到报错的内容和行号,但是却不知道是哪个JS文件报错了,请问大大们是怎么解决的,能分享下吗。谢谢
我也是从lua转过来的,发现creator的错误堆栈信息极其不友好,native下使用window.__errorHandler,浏览器下使用window.onerror捕获错误,但捕获到的报错都类似下面这样的:
`[file:src/jsb_polyfill.js]
[line:0]
[error:Uncaught TypeError: Cannot read property ‘length’ of null]
Error
at Function.saveLogOnWeb (src/project.js:954:9)
at cc.sys.isNative.window.__errorHandler (src/project.js:925:10)``
解决问题根本无从下手,请问有没有更好的方式能够定位线上错误呢?
同问如何捕获错误日志 @Colin Collins
@Colin Collins
这个也是没人需要的嘛
的确不直观,但是在Release包的时候,可能也获取不到正确的行数及函数名,所以这应该有难度
分享下我们的解决方案:
- 首先每次构建都要一个唯一的版本号, 我们使用的是当前的
git commit short hash - 构建后将
js backups (useful for debugging)目录分版本保存下来, 见 图1 - 监听 window.__errorHandler, 并将 错误内容和玩家id, 版本号 发送到远程服务器, 我们使用的是开源项目 sentry, 见 图2
- 根据服务器上的版本号找到对应版本的 project.js 及行号定位错误, 我们同时还向服务器发送了一些玩家的上下文日志信息, 很快便能定位到问题.
图1:

图2:
图片缩的有点小了, 大家可以右键在新标签打开查看大图.
你好__errorHandler 中会回调哪些参数 表示什么
window.__errorHandler = (file, line, msg, error) => {
};
对应的就是我上面截图的中的 file, line, msg, error
好的 谢谢啦
似乎捕获不到async方法里的错误?
请问
cocos2d-jsb.js
jsb-engine.js
如果这些文件报错,没有src/project.js报错信息,怎么处理呢?
这个就只能猜了, 分析下出错的内容, 再回想下和正确版本之间的变动. 或者你把错误发上来, 大家帮你看看.
我觉得重写下console.log,用个队列把日志前N条存起来,然后一起上报,感觉怎么样?
我们也是这么干的!
