2

是否可以在 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)

也许我的问题是如何抛出非致命的休息?

4

1 回答 1

2

检测您的进程是否正在调试的标准 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,也可能起作用。

于 2012-10-24T03:01:43.520 回答