[英]Condition evaluates to true while debugger says it should be false
遇到这种奇怪的情况时,我正在gdb中进行调试:
(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;
这怎么可能?
在这种情况下,我不会依赖您(或gdb的)运算符优先级的知识。 尝试添加几个括号以确保您,编译器和gdb实际上看到的是相同的东西...
newIterationRequired = ( ( infoAvailableUntil + 1 ) < ( sqrt( input ) + 1 ) ) && isPrime
哦,还有个提示:检出<stdbool.h>
...
编辑1:您的评论说这不能解决您的问题。
然后,将复杂的语句分开放入其子语句中。 将infoAvailableUntil + 1
存储到一个临时变量中。 将sqrt( input ) + 1
到另一个临时变量中。 从这些临时文件组成newIterationRequired
。 在GDB中,检查代码,您和GDB是否都同意每个中间步骤的结果。
这是基本调试 。 找出给您带来麻烦的语句,降低其复杂性,直到您发现错误或可以提出一个非常精确的问题。
(个人而言,我的下一个“最佳怀疑者”是,当您说sqrt()
时,您的代码和gdb会看到不同的东西。)
GDB不能正确评估sqrt,如下所示: 为什么gdb将sqrt(3)评估为0?
除非您使用-O0进行编译,否则无法确定单步执行的是一行源代码之后。 在您请求表达式求值时,所有参数可能没有完成,因此结果不可靠。
另一个解释是,该表达式的某些参数在活动寄存器中不再存在,因此gdb被欺骗了,并且执行了错误的计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.