C 当使用math.h函数时,gdb给出奇怪的输出

C 当使用math.h函数时,gdb给出奇怪的输出,c,gdb,C,Gdb,可能重复: 我是新手。当试图在线使用math.h函数时,gdb给出奇怪输出的原因一定有一个明显的解释。例如,下面的fabs函数应该取绝对值,并返回一个double (gdb) p cos(2*3.141/4) $13 = 1073291460 (gdb) p fabs(-3) $14 = 0 (gdb) p fabs(3) $15 = 0 (gdb) p fabs(3.333) $16 = 1 (gdb) p (double) fabs(-3.234) $17 = 1 (gdb) p

可能重复:

我是新手。当试图在线使用math.h函数时,gdb给出奇怪输出的原因一定有一个明显的解释。例如,下面的
fabs
函数应该取绝对值,并返回一个double

(gdb) p cos(2*3.141/4)
$13 = 1073291460
(gdb) p fabs(-3)    
$14 = 0
(gdb) p fabs(3)
$15 = 0
(gdb) p fabs(3.333)
$16 = 1
(gdb) p (double) fabs(-3.234)
$17 = 1
(gdb) p (double) fabs((double)-3.234)
$18 = 1
(gdb) p ((double(*)(double))fabs)(-3)
$19 = 682945
我使用的代码包括math.h,实际代码似乎执行正确,尽管放在gdb中的同一代码会产生奇怪的结果。我可以忽略它,但这似乎是一个很好的学习机会

gdb
缺少
cos
函数的调试信息,因此假设它是
int cos(…)
函数,因此没有正确返回值(特别是在x86上,因为存储浮点返回和整数返回的寄存器不同)

这可以通过指定类型来解决:

(gdb) p ((double(*)(double))cos) (1.0)
$18 = 0.54030230586813977

如果没有难读和难输入的强制转换,就没有办法向gdb提供信息吗?我认为用“-g”编译就足以避免此类问题。如果有必要,我用-g编译,并且没有包含任何优化标志。谢谢KennyTM。我原以为会发生类似的事情,但我用
(double)
fabs()
进行的实验似乎没有什么帮助(请参阅我对上述问题的最新编辑)。@Juan:看来你需要一个libm的调试版本,然后使用
\ucos
而不是
cos
(参考:),但是我无法让它工作。@ggkmath:将参数强制转换为
double
不会更改函数的签名(这是C,不是C++)。铸造函数本身
p((double(*)(double))fabs)(-3.234)
是唯一的方法。如果需要,版主可以随意关闭(例如删除),因为这是一个副本。