我正在开发一个 C++ 应用程序,并在 Android 上进行调试;碰巧的是,在某些设备上该应用程序会崩溃。我已将其范围缩小到一个函数,并尝试使用 ndk-gdb 中的断点进行调试。第一次,在开始时,该函数运行并且它很好地中断,例如:
Breakpoint 1, MyApp::MyFunc (this=0xb8541c40, curel=0xb8cb7e68, doShow=false)
at /path/to/src/MyApp.cpp:1600
1600 myObj.clear();
(gdb) c
Continuing.
在这里,我显然自己输入了 c
和 ENTER;但随后,根据用户操作,该函数第二次运行,我得到:
Breakpoint 1, MyApp::MyFunc (this=0xb8541c40, curel=0xb8cb7e68, doShow=true)
at /path/to/src/MyApp.cpp:1600
1600 myObj.clear();
(gdb)
Continuing.
Program received signal SIGABRT, Aborted.
0xb6f7b1b0 in tgkill ()
from /path/to/obj/local/armeabi-v7a/libc.so
(gdb)
Continuing.
Program received signal SIGABRT, Aborted.
0xb6f7b1b0 in tgkill ()
from /path/to/obj/local/armeabi-v7a/libc.so
(gdb)
Continuing.
Program terminated with signal SIGABRT, Aborted.
The program no longer exists.
所以,这里断点确实命中了,但它并没有中断 - 即使我没有按 c
,它也会继续“继续”,一次又一次地点击 SIGABRT“继续” ",最后程序终止。
根据这里有限的信息,有人知道为什么会发生这种情况以及如何补救吗?例如,这可能是由于优化所致(应用程序是在 Debug模式下编译的,但可能仍然存在一些优化)?顺便说一句,这是 GNU gdb (GDB) 7.7,android-ndk-r10e。
最佳答案
妈的,我傻了:)
.. 看,在我发出 c
之后发生了什么第一次,我在 gdb 中收到一堆消息,然后在应用程序等待输入时它们暂时停止。而且,通常我会在此处按 ENTER 几次,因此终端输出中会有一些空行,以分隔日志中的新阶段。
但是,gdb
将 ENTER 解释为“重复上一个命令”,这里是 c
继续,所以,当断点和 sigabrt 发生时,它基本上会“越过”它们(我确实觉得很奇怪,为什么我有时只在 sigabrt 处得到中断)。
嗯,就是这样 - 在调试时不要按 ENTER 在终端输出中腾出空间 :)
(并确保之前使用 gdb
严重终止的 session 中没有挂起的进程)
关于c++ - 为什么 gdb 会在断点处自动继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812409/