繁体   English   中英

条件评估为true,而调试器说应该为false

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM