【问题标题】:SIG33 when debugging native Android调试原生 Android 时的 SIG33
【发布时间】:2016-03-07 18:44:02
【问题描述】:

我正在使用 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?
  • Android Studio 1.3.1,NDK 10e
  • 只是一个想法:信号 33 可能用于程序,您的调试器应该通过它。我知道如何使用 gdb (handle SIG33 nostop noprint noignore pass) 做到这一点,但不知道如何使用 android studio 调试器;希望对您有所帮助。

标签: android c++ debugging android-ndk native


【解决方案1】:

信号 33 由仿生内部用于回溯设施。

comment in __libc_current_sigrtmin.cpp

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

请参阅genericarmx86mips__SIGRTMIN 的定义。

#define __SIGRTMIN 32

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

【讨论】:

  • 有趣。我使用的是 lldb,而不是 gdb,但我猜 lldb 的工作方式相同,而且这只发生在 lldb 刚附加到进程的最开始时。知道为什么它不会忽略它吗?
  • 您使用的是哪个版本的 lldb?它可能不会因为一个错误而忽略它,或者它是为另一个 linux 变体编译的。
  • 发生了一些崩溃,所以JVM需要打印回溯。主要问题是附加 gdb 时导致崩溃的原因。
【解决方案2】:

SIG33 被 LLDB 用来表示“线程库”。

摘自 LLDB 来源:

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

但我似乎不明白你的代码为什么会这样。可能是由于一些小的依赖问题。

【讨论】:

    【解决方案3】:

    可以使用下面的GDB 命令行忽略和/或静音:

    handle SIG33 nostop noprint
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多