在变量声明上设置断点时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>.