为什么gdb中“condition”和“break”的语法不同?

时间:2015-06-17 10:45:13

标签: debugging gdb

我似乎遇到了gdb的问题。假设我使用命令

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

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

 condition 3 if i==495

好吧,我在'if = = 495'附近的表达式中出现“语法错误”所以我尝试了:

condition 3 i==495

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

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

但是当条件达到时,它不会在断点处停止。所以我开始写这个问题,我尝试尝试:

 condition 3 "if i == 495"

并且万岁它有效。所以我想我的问题是:1。为什么两个命令之间的语法不同? 2.为什么信息如此令人困惑?如果i == 495“',新信息会显示'if',但是如果'i == 495'评估为真,那么不应该只评估为真?

2 个答案:

答案 0 :(得分:1)

你的最后一次尝试没有做你认为它正在做的事情。当你写:

cond 3 "if i == 495"

条件实际上是字符串常量&#34;如果i == 495&#34;,这绝不是假的。所以,断点就会停止。

您可以通过print i(对于某些点击它赢得495)或cond 3 "anything goes here!"来看到这一点。

正确的语法是你的第二次尝试:

cond 3 i == 495

我不能说为什么这不会触发你。

答案 1 :(得分:0)

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

SELECT vbak~vbeln, vbak~vtweg, vbap~posnr, vbap~matnr, vbap~vrkme
  INTO @DATA(l_work_area)
  FROM vbak INNER JOIN vbap ON vbak~vbeln = vbap~vbeln.
  WRITE: / l_work_area-vbeln, l_work_area-vtweg, l_work_area-posnr, l_work_area-matnr, l_work_area-vrkme.
ENDSELECT.

这样做的原因是您必须对逻辑运算符使用旧式的fortran语法((gdb) b foo.f:10 if i == 0 A syntax error in expression, near `= 0'. 而不是.eq.等)

==