c++ - 为什么 gdb 会在断点处自动继续?

标签 c++ debugging android-ndk gdb

我正在开发一个 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.

在这里,我显然自己输入了 cENTER;但随后,根据用户操作,该函数第二次运行,我得到:

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 几次,因此终端输出中会有一些空行,以分隔日志中的新阶段。

但是,gdbENTER 解释为“重复上一个命令”,这里是 c继续,所以,当断点和 sigabrt 发生时,它基本上会“越过”它们(我确实觉得很奇怪,为什么我有时只在 sigabrt 处得到中断)。

嗯,就是这样 - 在调试时不要按 ENTER 在终端输出中腾出空间 :) (并确保之前使用 gdb 严重终止的 session 中没有挂起的进程)

关于c++ - 为什么 gdb 会在断点处自动继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40812409/

相关文章:

c++ - 无法在 Visual Studio C++ 2013 中 #include OpenGL 的 freeglut

c++ - 使用 unix sendmail 发送电子邮件

c++ - 显然没有声明包含的类类型,为什么?

从安装程序打开时 Python 程序会崩溃,但如果从 Spyder IDE 运行脚本则不会崩溃

android r11 ndk 缺少 clang 工具链

c++ - C++ 中两个非常相似的类,只有一种不同的方法 : how to implement?

c++ - setupUi() 上的段错误

iphone - 打印出变量名objective-C

android - 为 Android 编译 Lua lib - 成功,但奇怪的段错误

android - 如何在 Android NDK 中创建新的 NativeWindow?