在变量声明上设置断点时GDB获得正确的停止点
给定以下代码:在变量声明上设置断点时GDB获得正确的停止点,gdb,breakpoints,Gdb,Breakpoints,给定以下代码: 1: int main(int argc, char **argv) { 2: int i; 3: 4: i = i + 1; 5: 6: ... 7: 8: } 当您在上述代码的第2行设置断点并在GDB中开始调试时,执行实际上会在第4行停止。这当然是正确的行为,但在调试之前,是否可以查询GDB以获得正确的停止点编号。。。就在创建断点之后 您可能正在寻找 info b (它是信息断点的缩写),并在第一个“
1: int main(int argc, char **argv) {
2: int i;
3:
4: i = i + 1;
5:
6: ...
7:
8: }
当您在上述代码的第2行设置断点并在GDB中开始调试时,执行实际上会在第4行停止。这当然是正确的行为,但在调试之前,是否可以查询GDB以获得正确的停止点编号。。。就在创建断点之后 您可能正在寻找
info b
(它是信息断点的缩写
),并在第一个“列”中给出数字
如果要在修改变量时中断,请使用观察点。GDB总是在断点后最近的可执行代码行中断(如果按行设置)。变量声明不是可执行代码,因此将使用下一行(非空)的赋值
如果你想知道它停在哪一行,我认为GDB提示符上没有这样的东西。但是,您仍然可以使用观察点,并使用命令
自定义在休息和观察点上发生的情况
根据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)是有用的,但请阅读手册以了解正确的说明。我还可以热情地推荐诺斯塔克的《调试艺术》一书
(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)信息行*0x0000000000400547
“main.cpp”的第4行开始于地址0x400547,结束于0x400550。
正如您在“main.cpp的第4行”上看到的,当您写入时,实际断点似乎不起作用:
(gdb)info b Num Type Disp Enb Address哪一个断点在main(int,char**)的main中保留y 0x000000000040547。cpp:2
@skwllsp:将其添加到答案中。谢谢。据我所知@user1883815希望在这种情况下看到main.cpp:4,而您的命令仍然显示main.cpp:2@skwllsp:GDB提示符上没有这样的内容,因为我也试图在解释中传达。我也给了他一个他更可能想要的选择。如果一开始不是作为观察点的话,为什么会有人在声明上设置bpx呢?不错,我没想过这样做+1.无论如何,我要留下我的答案,因为我认为我的意图更可能是设定一个观察点。
(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>.