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

GDB - how to get into stepping mode from the very beginning

本文关键字:步进 模式 一开始 GDB      更新时间:2023-10-16

通常,要从c++程序执行的最开始进入步进模式,可以在GDB中使用break main命令。但这只会在main()函数的入口处中断程序。

如何在第一个用户编写的操作(例如,静态定义类实例的构造函数)上中断程序?

例如,如果我有以下代码,我如何在不使用break 5命令的情况下中断A() ?

#include <iostream>
struct A {
    A() {
        std::cout << "A()" << std::endl;
    }
};
static A a;
int main() {
    return 0;
}

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

可以在构造函数中定义断点。

(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)