当前位置: 首页 > 知识库问答 >
问题:

Android-JNI/NDK-SIGSEV崩溃-未触发信号处理

拓拔嘉颖
2023-03-14

我有Android原生C代码。然而,有时当我将应用程序发送到后台并返回时,它会与<code>SIGSEGV

JNI_OnLoad方法中,我添加了:

struct sigaction sighandler;
memset (&sighandler, '\0', sizeof(sighandler));   
sighandler.sa_sigaction = &android_sigaction;
sighandler.sa_flags = SA_SIGINFO;

int watched_signals[] = { SIGABRT, SIGILL, SIGSEGV, SIGINT, SIGKILL };
for(int signal : watched_signals)
{
    sigaction(signal, &sighandler, &old_sa[signal]);
}

我有:

static struct sigaction old_sa[NSIG];

static void android_sigaction(int signal, siginfo_t *siginfo, void *context)
{
    MY_LOG("Sending PID: %ld, UID: %ld\n", (long)siginfo->si_pid, (long)siginfo->si_uid);

    old_sa[signal].sa_handler(signal);
}

然而,当应用程序从后台退出时,< code>android_sigaction不会因该错误而触发。我试图在代码中创建bug(在数组边界之外编写),用按钮触发它,回调被正确调用。这是怎么回事?

共有1个答案

卫梓
2023-03-14

假设您使用的是Android 5.0设备,您的问题可能是由ART造成的。它暴露了自己的<code>信号(),因此它有机会窃取信号并将其传递到其他地方。出于调试目的,您可以尝试直接系统调用:

for(int signal : watched_signals)
{
    syscall(_NR_sigaction, signal, &sighandler, &old_sa[signal]);
}

所以现在你的处理程序直接进入内核,ART不应该改变它。当然只是为了调试是可以的。如果你想这样做——你需要开发一些逻辑来尊重前面的处理程序。

P. S.还检查返回值和errno也是一个好主意。

 类似资料:
  • 我有NDK C代码,它会产生SIGSEGV错误。我找不到它。自定义信号处理返回空堆栈跟踪。 如果我在Android Studio调试器中捕捉到错误,我会得到以下跟踪: 线程93-RxNewThreadSche 没有一个代码是“我的”。只有“熟悉”是第一行,但我不知道在哪里可以找到它。有什么想法吗?

  • 我正在尝试修复崩溃,例如: 1: 2: 三: 我已经复习了IndirectReferenceTable()的源代码https://android.googlesource.com/platform/art//kitkat dev/runtime/indirect\u reference\u表。cc),它似乎因为表溢出而崩溃。 据我所知,我正在正确删除所有本地引用。 问题是否可能与当地参考文献无关?

  • 在Android NDK项目中,我们需要使用HAL接口访问蓝牙。我们的意图是这样做: 每个人似乎都这么做(在谷歌示例代码中)。当我们试图编译时,似乎出现了一个问题: 我们在Android.mk中正确添加了清单权限和正确添加的库 我们还需要补充什么吗?有没有可以参考的工作项目?

  • 我的Android应用在使用时崩溃 这是我收到的唯一明显的错误消息: 无法将堆栈跟踪写入/data/anr/跟踪。txt(6738中的5571):没有这样的文件或目录 libMySharedLib.so 是从 ndk-build 生成的。我正在使用powerVR SDK,因此我假设这个库是事先在内部加载的。 如果我将我的代码分离到一个不同的共享库中,我可以让它工作,但这违背了我的需要(所有数据、指

  • 我正在通过ndk构建一个支持本地构建的Android应用程序。此外,我使用Crashlytics NDK来获取jni和cpp崩溃的崩溃报告。有时,Crashlytics NDK无法为cpp类中的崩溃发送崩溃报告(java和jni工作得很好)。 这似乎是crashlytics ndk框架中的一个错误。 正在使用以下版本: Crashlytics Gradle配置: 有推荐吗?

  • 我已经编译了一个用于jni的测试dll。除了#include之外,它实际上完全是空的 这是加载库的类: true是最后打印的内容,证明错误在true和loaded!之间!。如果我在eclipse中运行,会打印两条错误消息,但互联网不知道它们是什么。 信息: 堆栈转储是无信息的。 当我在维基百科页面上运行示例时,实验也失败了。它以同样的方式失败。