【发布时间】:2010-11-08 03:54:53
【问题描述】:
我正在将a project 迁移到新的 Android 原生开发工具包(即 JNI),并且我想捕获 SIGSEGV,如果它发生(可能还有 SIGILL、SIGABRT、SIGFPE),以便提供一个不错的崩溃报告对话框,而不是(或之前)当前发生的事情:进程立即无礼地死亡,并且操作系统可能尝试重新启动它。 (编辑: JVM/Dalvik VM 捕获信号并记录堆栈跟踪和其他有用信息;我只是想为用户提供将这些信息通过电子邮件发送给我的选项。)
情况是:我没有编写的大量 C 代码在这个应用程序中完成了大部分工作(所有游戏逻辑),虽然它在许多其他平台上经过了很好的测试,但我完全有可能,在我的 Android 端口中,会给它提供垃圾并导致本机代码崩溃,所以我想要当前显示在 Android 日志中的崩溃转储(本机和 Java)(我猜在非 Android 情况下它会是 stderr )。我可以随意修改 C 和 Java 代码,尽管回调(传入和传出 JNI)大约有 40 个,而且很明显,小差异的奖励积分。
我听说过 J2SE 中的信号链库 libjsig.so,如果我可以在 Android 上安全地安装这样的信号处理程序,那将解决我的问题的关键部分,但我看不到这样的库安卓/达尔维克。
【问题讨论】:
-
如果可以通过包装脚本启动Java VM,可以检查应用程序是否异常退出,并进行报错。这将允许您干净地捕获各种异常退出,无论是 SIGSEGV、SIGKILL 还是其他。但是,我认为这对于现有的 Android 应用程序是不可能的,因此将其发布为评论(从答案转换而来)。
-
另请参阅:Can't run a Java Android program with Valgrind,了解如何使用包装脚本(在 adb shell 中)启动 Android 应用。
-
答案需要更新。由于调用非异步信号安全函数,已接受答案中提供的源代码将导致未定义的行为。请看这里:stackoverflow.com/questions/34547199/…
标签: android java-native-interface signals android-ndk segmentation-fault