【问题标题】:Continue after assert with Android NDK and GDB使用 Android NDK 和 GDB 断言后继续
【发布时间】:2012-10-23 21:34:02
【问题描述】:

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

也许我的问题是如何抛出一个非致命中断?

【问题讨论】:

    标签: android eclipse android-ndk gdb breakpoints


    【解决方案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,也可能起作用。

    【讨论】:

    • 澄清一下,我不是在寻找一种在未附加调试器时完全跳过中断的方法。我希望能够中断,暂停到调试器(这部分已经工作),然后能够点击“继续”以恢复运行程序。现在,如果我在中断后尝试恢复,我会收到一个错误(将错误添加到原始问题):致命信号 11 (SIGSEGV) at 0xfffffffd (code=1)。
    • 然后看here
    • 就是这样!我已编辑您的答案以包含该链接并将其标记为已回答。谢谢!
    • 根据他们的答案进行了编辑。
    • 我认为 SIGABRT 在这种情况下不起作用;导致应用程序中止。 SIGINT 为我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多