1

给定以下代码片段:

1:    int main(int argc, char **argv) {
2:       int i;
3:    
4:       i = i + 1;
5:    
6:       ...
7:    
8:    }

当您在第 2 行设置断点时:在上述代码中并在 GDB 中开始调试时,执行实际上在第 4 行停止:。这当然是正确的行为,但是是否可以在调试 之前查询 GDB 以获取正确的停止点编号……在创建断点之后。

4

2 回答 2

2
(gdb) b 2
Breakpoint 1 at 0x400547: file main.cpp, line 2.

info b表明:

(gdb) info b $bpnum
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400547 in main(int, char**) at main.cpp:2

您需要为“地址”列中的地址执行此操作:

(gdb) info line *0x0000000000400547
Line 4 of "main.cpp" starts at address 0x400547 <main(int, char**)+11> and ends at 0x400550 <main(int, char**)+20>.

如您所见,“main.cpp 的第 4 行”上的真正断点

于 2012-12-11T13:53:03.820 回答
0

可能你正在寻找

info b

(是 的缩写info breakpoints)并在第一个“列”中给出数字。

如果您想在变量被修改时中断,请改用观察点。GDB 将始终在断点之后最近的可执行代码行处中断(如果按行设置)。变量声明不是可执行代码,因此将使用下一行(非空)上的赋值。

如果您正在寻找的是确切地知道它在哪一行停止,我认为 GDB 提示符上没有这样的东西。但是,您仍然可以使用观察点并使用commands.


从 skwllsp 写的评论来看,它的外观如下:

(gdb) info b
Num    Type       Disp  Enb Address            What
1      breakpoint keep  y   0x0000000000400547 in main(int, char**) at main.cpp:2

这表示有一个断点 ( 1),它已启用,它也向您显示该行。处置 (Disp) 和启用 (Enb) 很有用,但请阅读手册以获得正确的描述。我也可以热烈推荐 Nostarch 的《调试艺术》一书。

于 2012-12-11T13:19:17.350 回答