给定以下代码片段:
1: int main(int argc, char **argv) {
2: int i;
3:
4: i = i + 1;
5:
6: ...
7:
8: }
当您在第 2 行设置断点时:在上述代码中并在 GDB 中开始调试时,执行实际上在第 4 行停止:。这当然是正确的行为,但是是否可以在调试 之前查询 GDB 以获取正确的停止点编号……在创建断点之后。
给定以下代码片段:
1: int main(int argc, char **argv) {
2: int i;
3:
4: i = i + 1;
5:
6: ...
7:
8: }
当您在第 2 行设置断点时:在上述代码中并在 GDB 中开始调试时,执行实际上在第 4 行停止:。这当然是正确的行为,但是是否可以在调试 之前查询 GDB 以获取正确的停止点编号……在创建断点之后。
(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 行”上的真正断点
可能你正在寻找
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 的《调试艺术》一书。