通常,要从C ++程序执行的最开始进入步进模式,请在GDB中使用break main
命令。但这只会在main()
的入口处打破程序。
问题是如何在第一个用户编写的操作(例如,静态定义的类实例的构造函数)上中断程序?
例如,如果我有以下代码,如何在不使用A()
命令的情况下在break 5
处中断?
#include <iostream>
struct A {
A() {
std::cout << "A()" << std::endl;
}
};
static A a;
int main() {
return 0;
}
更新:实际上,我调试了其他人编写的非常大的代码。代码中有许多分散在不同源文件中的静态类实例。在每个构造函数上手动设置断点是不可行的。
答案 0 :(得分:2)
您可以在构造函数中定义断点。
(gdb) break 'A::A()'
Breakpoint 1 at 0x8048724: file x.cc, line 4.
(gdb) run
Starting program: /.../a.out
Breakpoint 1, A::A (this=0x804a0ce <a>) at x.cc:4
4 std::cout << __func__ << std::endl;
(gdb) bt
#0 A::A (this=0x804a0ce <a>) at x.cc:4
#1 0x08048700 in __static_initialization_and_destruction_0 (__initialize_p=1,
__priority=65535) at x.cc:8
#2 0x0804871c in _GLOBAL__sub_I_main () at x.cc:10
#3 0x080487a2 in __libc_csu_init ()
#4 0xb7d44a1a in __libc_start_main (main=0x80486ad <main()>, argc=1,
argv=0xbffff184, init=0x8048750 <__libc_csu_init>,
fini=0x80487c0 <__libc_csu_fini>, rtld_fini=0xb7fed180 <_dl_fini>,
stack_end=0xbffff17c) at libc-start.c:246
#5 0x080485d1 in _start ()
(gdb)
请注意使用单引号表示标识符是C ++损坏的。另请注意,堆栈跟踪显示尚未调用main()
。
从堆栈跟踪中,有许多选项可以设置在任何全局构造函数被调用之前的断点。其中一个断点是_start
。
(gdb) break _start
Breakpoint 1 at 0x80485b0
(gdb) run
Starting program: /.../a.out
Breakpoint 1, 0x080485b0 in _start ()
(gdb) bt
#0 0x080485b0 in _start ()
(gdb)