__errorHandler这个回调捕获的信息好像不直观

在做报错日志的收集,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

@crazypad

这个也是没人需要的嘛

的确不直观,但是在Release包的时候,可能也获取不到正确的行数及函数名,所以这应该有难度

分享下我们的解决方案:

  1. 首先每次构建都要一个唯一的版本号, 我们使用的是当前的 git commit short hash
  2. 构建后将 js backups (useful for debugging) 目录分版本保存下来, 见 图1
  3. 监听 window.__errorHandler, 并将 错误内容和玩家id, 版本号 发送到远程服务器, 我们使用的是开源项目 sentry, 见 图2
  4. 根据服务器上的版本号找到对应版本的 project.js 及行号定位错误, 我们同时还向服务器发送了一些玩家的上下文日志信息, 很快便能定位到问题.

图1:

图2:

图片缩的有点小了, 大家可以右键在新标签打开查看大图.

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条存起来,然后一起上报,感觉怎么样?

我们也是这么干的!

你好,怎么我上传的error,在服务器上看,是空的数组呢?