调试Android本地应用时出现SIG33错误

13

我正在使用Android Studio调试一个用C++编写的NativeActivity应用程序。
在我的C++代码中,我在android_main()中首先等待10秒钟以便调试器附加。在“调试”窗口中我看到:

Now Launching Native Debug Session

然后过了几秒钟

Debugger attached to process 28458

并且紧接着它附加后,调试器会因为信号而停止:

Signal: 33 (signal SIG33)

我点击“恢复程序”,然后连续7-8次收到相同的信号,之后程序按预期继续运行,调试器已连接,我可以在断点处停止它。

那个SIG33是什么意思?如何防止它发生?


你正在使用哪个版本的Android Studio? - wizurd
Android Studio 1.3.1,NDK 10e - shoosh
1
只是一个想法:信号33可能是针对程序的,你的调试器应该将其传递。我知道如何在gdb中执行此操作(handle SIG33 nostop noprint noignore pass),但不知道如何在Android Studio调试器中执行;希望能有所帮助。 - YSC
3个回答

6

33号信号在bionic内部用于回溯功能。

请参见__libc_current_sigrtmin.cpp中的注释

// POSIX timers use __SIGRTMIN + 0.
// libbacktrace uses __SIGRTMIN + 1.
// libcore uses __SIGRTMIN + 2.

请参见通用armx86mips中的__SIGRTMIN定义。
#define __SIGRTMIN 32

我认为SIG33是由gdb引起的,而gdb没有正确地忽略它。

有趣。我正在使用lldb而不是gdb,但我猜lldb的工作方式是一样的,这种情况只发生在lldb刚刚附加到进程时。你知道为什么它不会忽略它吗? - shoosh
你正在使用哪个版本的lldb?这可能不是因为一个错误或者它是为另一种Linux变体编译而忽略它。 - programmerjake
发生了一些崩溃,因此JVM需要打印回溯。主要问题是在附加gdb时导致崩溃的原因。 - SDJSK

2

以下是可以使用 GDB 命令行忽略或消除的内容:

handle SIG33 nostop noprint

1

SIG33被LLDB用于指示“线程库”。

来自LLDB源代码的摘录:

AddSignal (33, "SIG33", false, false, false, "threading library internal signal 2");

但我似乎不明白为什么你的代码会出现这种情况。可能是由于一些轻微的依赖问题所致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接