给出以下代码sippet:
1: int main(int argc, char **argv) {
2: int i;
3:
4: i = i + 1;
5:
6: ...
7:
8: }
在第2行设置断点时:在上面的代码中并在GDB中开始调试,执行实际上在第4行停止:这当然是正确的行为但是,可以在创建断点之后立即在调试之前向GDB查询正确的停止点编号。
答案 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的“调试艺术”一书。