GDB在变量声明上设置断点时获取正确的停止点

时间:2012-12-11 13:14:46

标签: gdb breakpoints

给出以下代码sippet:

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

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

2 个答案:

答案 0 :(得分: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行”中看到真正的断点

答案 1 :(得分: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的“调试艺术”一书。