相关疑难解决方法(0)

如何在Android上的JNI下捕获SIGSEGV(分段错误)并获得堆栈跟踪?

我正在将一个项目转移到新的Android Native Development Kit(即JNI),我想抓住SIGSEGV,如果它发生(可能还有SIGILL,SIGABRT,SIGFPE),以便提供一个很好的崩溃报告对话框,而不是(或之前)当前发生的事情:该过程立即毫不客气地死亡,并且可能是操作系统重启它的一些尝试.(编辑: JVM/Dalvik VM捕获信号并记录堆栈跟踪和其他有用信息;我只是想为用户提供将该信息真正通过电子邮件发送给我的选项.)

情况是:我没有编写的大量C代码完成了这个应用程序中的大部分工作(所有游戏逻辑),虽然它在很多其他平台上都经过了很好的测试,但我完全有可能在我的Android中端口,将它提供垃圾并导致本机代码崩溃,所以我想要当前显示在Android日志中的崩溃转储(本机和Java)(我想在非Android情况下它将是stderr).我可以随意修改C和Java代码,尽管回调(进入和退出JNI)的数量大约为40,显然,小差异的奖励积分.

我听说过J2SE中的信号链接库,libjsig.so,如果我可以在Android上安全地安装这样的信号处理程序,这将解决我的问题的捕捉部分,但我看不到Android/Dalvik这样的库.

java-native-interface android signals segmentation-fault android-ndk

90
推荐指数
4
解决办法
6万
查看次数

如何捕获JNI/Java异常

我的应用程序中有一个JNI层.在某些情况下,Java会抛出异常.如何在JNI层中获取Java异常?我的代码如下所示.

if((*(pConnDA->penv))->ExceptionCheck(pConnDA->penv))
{
    (*(pConnDA->penv))->ExceptionDescribe(pConnDA->penv); 
    (*(pConnDA->penv))->ExceptionClear(pConnDA->penv);
}
Run Code Online (Sandbox Code Playgroud)

这个代码块是否只捕获JNI异常?将在控制台(stderr)中记录异常描述的位置?如何将其插入缓冲区,以便将其传递给记录器模块?

java-native-interface

26
推荐指数
2
解决办法
4万
查看次数

在Android上用例外替换JNI崩溃

我开发了一个使用本机C库的Android应用程序.我可以用JNI成功编译整个东西,一切顺利.

但是,偶尔本机C库崩溃(最常见的是SIGSEGV).反过来,这会导致我的应用程序在没有任何有意义的用户通知的情况下崩溃.我想要实现的目标如下:

  1. 使用信号处理程序(sigaction)捕获本机代码中的信号以防止随机崩溃
  2. 在Java可以捕获的C库中抛出异常
  3. 在Java中捕获异常,为用户生成有意义的警告消息并使应用程序保持运行

如果这对你有用 - JNI代码在一个单独的线程中运行(在AsyncTask中更精确).

我已经检查了http://blog.httrack.com/blog/2013/08/23/catching-posix-signals-on-android/https://github.com/xroche/coffeecatch 但我无法编译.

遵循Best方法在JNI代码中抛出异常的建议如何捕捉JNI崩溃与使用信号处理基础的机制在Java异常https://www.developer.com/java/data/exception-handling-in-jni.html 我进行下面的步骤:

在我的本机代码中,我添加了以下函数(据我所知)设置了一个信号处理程序:

void initializeSignalHandler(JNIEnv* env){
    int watched_signals[] = { SIGABRT, SIGILL, SIGSEGV, SIGINT, SIGKILL }; // 6, 4, 11, 2, 9
    struct sigaction sighandler;
    memset(&sighandler, 0, sizeof(sighandler));

    sighandler.sa_sigaction = &sighandler_func;
    sighandler.sa_mask = 0;
    sighandler.sa_flags = SA_SIGINFO | SA_ONSTACK;
    for(int ii=0; ii<5; ii++){
        int signal = watched_signals[ii];
        sigaction(signal, &sighandler, NULL);        
    }
    env = env;
}
Run Code Online (Sandbox Code Playgroud)

我处理这些信号的函数如下所示:

void sighandler_func(int sig, siginfo_t* …
Run Code Online (Sandbox Code Playgroud)

c java android signals android-ndk

7
推荐指数
1
解决办法
804
查看次数