2011-02-25 62 views
1

我在gdb调试时,我碰到这个怪胎来了:条件计算为true,而调试器说,这应该是假

(gdb) 
107      newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE; 
(gdb) 
107      newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE; 
(gdb) print infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE 
$11 = FALSE 
(gdb) s 
108      if (newIterationRequired) 
(gdb) print newIterationRequired 
$13 = TRUE 

newIterationRequired的类型是一个枚举,其模拟从C++布尔行为:

typedef enum { FALSE, TRUE } bool; 

这怎么可能?

+2

可读性建议:'值=条件? TRUE:FALSE;'与'value = condition;'相同(假设'TRUE'为1,'FALSE'为0,它们是)。 – Marlon 2011-02-25 10:04:43

+0

这是在多线程环境中运行吗?你确定你没有跳过可能会改变'newIterationRequired'值的指令吗? – templatetypedef 2011-02-25 10:06:51

+1

也许在C中的优先权不同于GDB? – rene 2011-02-25 10:08:23

回答

2

GDB不评估SQRT正确如图有:Why does gdb evaluate sqrt(3) to 0?

+0

这很可能是正确的答案。希望@pieter会接受它。 – 2011-02-28 00:09:32

+0

'print((infoAvailableUntil + 1)<(__sqrt(input)+1))&& isPrime' does not work。标记为已接受。 – Pieter 2011-02-28 08:18:22

2

在这种情况下,我不会依赖于你的(或gdb)关于运算符优先级的知识。尝试添加一些括号,以确保您的编译器和gdb实际上是看到了同样的事情...

newIterationRequired = ((infoAvailableUntil + 1) < (sqrt(input) + 1)) && isPrime 

哦,还有一个提示:退房<stdbool.h> ...

编辑1:你的评论说这并没有解决你的问题。

那么,选择复杂的语句拆分到它的子状态。将infoAvailableUntil + 1存储到临时变量中。将sqrt(input) + 1存储到另一个临时变量中。撰写newIterationRequired从那些临时工。在GDB内部,检查代码,你和GDB是否同意每个中间步骤的结果。

这是elementary debugging。挑选给你麻烦的陈述,减少它的复杂性,直到你发现错误或者可以提出一个非常精确的问题。

(就个人而言,我的下一个“最佳嫌疑人”是你的代码和gdb看到不同的东西,当你说sqrt()

+0

运算符优先级也是我的第一个想法。 – 2011-02-25 10:34:51

+0

我将它改为'newIterationRequired =((infoAvailableUntil + 1)<(sqrt(input)+1))&& isPrime',我现在使用'stdbool.h'。但这并不能解决问题。 – Pieter 2011-02-25 15:19:18

+0

将声明分解为多个变量不知何故给了我正确的结果:http://pastebin.com/jefyntWM这怎么可能? – Pieter 2011-02-25 19:54:36

1

除非你用-O0编译,你可以不说,单步运行一个肯定另一个源代码行。有可能在您请求表达式评估时,所有参数尚未完成,因此结果不可靠。

另一种解释是,表达式的某些参数在活寄存器中不再存在,所以gdb被愚弄,并做了错误的计算。

+1

+1用于提及除“-O0”代码之外的其他任何其他代码的相对毫无价值的调试。我把'-O0'视为理所当然,但你永远不知道...... – DevSolar 2011-02-25 10:49:11

+0

编译时,我确实使用了'-O0'作为'gcc'的参数。 (好吧,Eclipse的编译输出表明它的确如此。) – Pieter 2011-02-25 15:21:26

+0

你能检查每个变量是否包含你期望的值吗? – 2011-02-25 16:14:14