为什么 "condition" 和 "break" 的语法在 gdb 中不同?

why is the syntax for "condition" and "break" different in gdb?

我似乎对 gdb 有疑问。假设我使用命令

在 i 的循环中创建了一个条件断点
 break file.cpp:line_no  if i==120

一切都很好,它创建了断点 3,代码在 i==120 时中断。现在我在 i==495 处遇到问题,我想重新使用相同的断点,所以我使用:

 condition 3 if i==495

好吧,我在 `if i==495' 附近遇到“表达式语法错误所以我尝试:

condition 3 i==495

没有更多错误,断点的信息看起来很有希望:

 3       breakpoint     keep y   <MULTIPLE>         
         stop only if i==495

但是到达条件后并没有在断点处停止。所以我开始写这个问题,然后我想到尝试:

 condition 3 "if i == 495"

太棒了!所以我想我的问题是: 1. 为什么两个命令之间的语法不同?和 2. 为什么信息如此混乱?新信息说 'if "if i==495"',但如果 'i==495' 评估为真,那不应该只评估为真吗?

你最后一次尝试并没有按照你认为的去做。当你写:

cond 3 "if i == 495"

条件实际上是字符串常量"if i == 495",它永远不会为假。所以,断点停止。

您可以通过执行 print i(对于某些点击它不会是 495)或 cond 3 "anything goes here!".

来查看此信息

第二次尝试语法正确:

cond 3 i == 495

我不能说为什么这对你没有触发。

如果您使用 gdb 调试 fortran,则在尝试合理的命令时可能会出现语法错误:

(gdb) b foo.f:10 if i == 0
A syntax error in expression, near `= 0'.

原因是您必须对逻辑运算符使用 old-style fortran 语法(.eq. 而不是 == 等等):

(gdb) b foo.f:10 if i .eq. 0 
Breakpoint 1 at 0x432738: file foo.f, line 10.