是否可以在 Android NDK 程序中从 C++ 触发 GDB 中断,但仍允许程序在之后恢复?
意思是,我按下了断言,导致 GDB 停止程序,并且我希望能够在 Eclipse 中按“播放”按钮来恢复程序,继续执行断言之外的操作。
现在我正在使用:
__asm__ ("bkpt 0");
这会触发程序停止,并将我带到触发它的代码行,但不允许我在之后恢复。
GDB 在程序停止时输出以下内容。
(gdb)
82 info signal SIGBUS
&"info signal SIGBUS\n"
~"Signal Stop\tPrint\tPass to program\tDescription\n"
~"SIGBUS Yes\tYes\tYes\t\tBus error\n"
82^done
(gdb)
如果我此时按“恢复”,我会在 LogCat 中得到以下输出:
Fatal signal 11 (SIGSEGV) at 0xfffffffd (code=1)
也许我的问题是如何抛出一个非致命中断?
最佳答案
检测进程是否正在调试的标准 Linux 方法是:
if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
//Yes, we're running under GDB
考虑到这一点,执行一个仅在调试器下触发的条件硬断点 (bkpt 0
)。
不确定 Android 中的仅 Java 调试是否会影响 ptrace。尝试一下。
编辑:调用raise(SIGABRT)
来中断。然后在 GDB 中输入 signal 0
继续。其他信号(例如 SIGINT 和 SIGTRAP)也可能起作用。
关于android - 使用 Android NDK 和 GDB 断言后继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039652/