GDB - 如何从一开始就进入步进模式

时间:2014-08-24 19:12:49

标签: c++ debugging gdb

通常,要从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;
}

更新:实际上,我调试了其他人编写的非常大的代码。代码中有许多分散在不同源文件中的静态类实例。在每个构造函数上手动设置断点是不可行的。

1 个答案:

答案 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)