js产物异常堆栈还原

大约 2 分钟

js产物异常堆栈还原

以js产物模式运行kuikly时,发生运行时的crash并不会触发App发生crash,只会导致该页面白屏;本文介绍如何收集js模式的异常,以及如何还原该异常堆栈到原始的kotlin代码。

注:目前仅推荐iOS下使用js模式进行动态化下发kuikly代码,故本文以iOS的jsc引擎为例子

JavascriptCore下异常捕获

  1. 通过KuiklyRenderViewControllerDelegatorDelegate设置js源码路径

    // KuiklyRenderViewControllerDelegatorDelegate 协议
    
    @protocol KuiklyRenderViewControllerDelegatorDelegate<NSObject>
    
    /*
     * @breif contextCode环境代码对应的url,可为本地path或者远程url; jsc 的异常信息需要这个;不影响脚本的执行,仅为了提取异常信息
     */
    - (NSString *)contextUrl;
    
    @end
    

    jsC需要js文件的原始路径(本地path或者远程url都可,推荐本地解压后的path),来提供详细的js执行异常信息。所以在Kuikly的初始化delegate中,需要通过contextUrl接口返回js代码的存储路径。 该路径信息不会影响到脚本的执行,仅在js异常发生时,用来提供异常的原始信息。

  2. 获取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工具open in new window实现js堆栈解析

上次编辑于:
Kuikly AI助手