js产物异常堆栈还原
大约 2 分钟
js产物异常堆栈还原
以js产物模式运行kuikly时,发生运行时的crash并不会触发App发生crash,只会导致该页面白屏;本文介绍如何收集js模式的异常,以及如何还原该异常堆栈到原始的kotlin代码。
注:目前仅推荐iOS下使用js模式进行动态化下发kuikly代码,故本文以iOS的jsc引擎为例子
JavascriptCore下异常捕获
通过KuiklyRenderViewControllerDelegatorDelegate设置js源码路径
// KuiklyRenderViewControllerDelegatorDelegate 协议 @protocol KuiklyRenderViewControllerDelegatorDelegate<NSObject> /* * @breif contextCode环境代码对应的url,可为本地path或者远程url; jsc 的异常信息需要这个;不影响脚本的执行,仅为了提取异常信息 */ - (NSString *)contextUrl; @endjsC需要js文件的原始路径(本地path或者远程url都可,推荐本地解压后的path),来提供详细的js执行异常信息。所以在Kuikly的初始化delegate中,需要通过contextUrl接口返回js代码的存储路径。 该路径信息不会影响到脚本的执行,仅在js异常发生时,用来提供异常的原始信息。
获取js异常堆栈信息
Kuikly IOSRender中已经注册了对Kotlin侧异常发生时的回调,可接收到异常的堆栈信息。也包括获取到js异常的堆栈信息。因此业务仅需在KuiklyRenderViewController容器内实现监听回调接口即可获取到堆栈信息。
方法一:增加NSNotification事件监听机制,捕捉Render侧收到堆栈信息时所post出的堆栈信息内容。
// KuiklyRenderViewController.m [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKuiklyException:) name:kKuiklyFatalExceptionNotification object:nil]; - (void)handleKuiklyException:(NSNotification *)noti { if (noti.userInfo && noti.userInfo[@"exception"]) { NSString *exceptionString = noti.userInfo[@"exception"]; NSArray *components = [exceptionString componentsSeparatedByString:@"\n"]; NSString *exceptionName = [components firstObject]; NSArray<NSString *> *callStackArray = [components subarrayWithRange:NSMakeRange(1, components.count - 1)]; // 堆栈信息其他处理逻辑 ... }方法二:实现onUnhandledException方法
// KuiklyRenderViewController.m - (void)onUnhandledException:(NSString *)exReason stack:(NSString *)callstackStr mode:(KuiklyContextMode)mode { // 堆栈信息其他处理逻辑 ... }
js异常的堆栈还原
可采用SourceMapTool工具实现js堆栈解析