最近在使用C++在NDK环境下开发,发现无法使用try catch捕获异常,请问NDK环境下如何捕获异常?
想在程序crash的时候,做个dump文件.方便大规模测试.

解决方案 »

  1.   

    貌似不太容易实现,可以试试在ndk层catch信号,收到信号的时候去logcat里拿log吧。
      

  2.   


    可以具体点吗?
    我这边类似
    try
    {
    renderFrame();
    } catch (const std::exception& e)
    {
    __android_log_print( ANDROID_LOG_INFO, "debug", "catch catch catch catch catch\n" );
    jclass jc = env->FindClass("java/lang/Error");
    if(jc) env->ThrowNew (jc, "unidentified exception");
    }
    catch (...)
    {
    __android_log_print( ANDROID_LOG_INFO, "debug", "catch catch catch catch catch\n" );
        jclass jc = env->FindClass("java/lang/Error");
        if(jc) env->ThrowNew (jc, "unidentified exception");
    }
      

  3.   

    上面类似的代码,
    renderFrame里面我估计写几个错误的指针操作.
    不会进入catch块.程序直接就崩掉了.
      

  4.   

    ndk层catch信号,可以具体点吗?
    因为不是在调试环境做crash dump.是想做apk出来运行,获取dump文件,存起来.
      

  5.   

    我的意思是在c代码里注册信号处理函数,指针操作的问题不是都signal 11 什么的吗。
    个人想法,仅供参考,呵呵。
      

  6.   

    我在native层注册信号处理函数,然后在crash 发生的时候 ,通知java层 启动了一个activity,用这个activity去logcat收集 crash信息。再输出到sd卡里面。都ok.
    但是有一个奇怪的问题。 logcat 的log里面 没有 内存的信息 。
    类似这些 
    04-24 05:37:00.476: I/DEBUG(58): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00001a85
     04-24 05:37:00.476: I/DEBUG(58):  r0 f6502688  r1 00000000  r2 f6502688  r3 00001a85
     04-24 05:37:00.476: I/DEBUG(58):  r4 00003000  r5 00000000  r6 00000039  r7 00000000
    04-24 05:37:00.558: I/DEBUG(58):          #00  pc 50408a56  /data/data/tiny.test2/lib/libcaneth.so
     04-24 05:37:00.558: I/DEBUG(58):          #01  lr
    没有这些的话,我没有办法定位具体crash的地址 。。
    是不是还要设些别的? 谢谢!