c - gdb 在使用 math.h 函数时给出奇怪的输出

标签 c gdb

<分区>

Possible Duplicate:
Why does gdb evaluate sqrt(3) to 0?

这里是 C 新手。必须有一个明显的解释,为什么 gdb 在尝试内联使用 math.h 函数时给出奇怪的输出。例如,下面的 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 中内联的相同代码会产生奇怪的结果。我可以忽略它,但这似乎是一个很好的学习机会。

最佳答案

(引用:http://lists.gnu.org/archive/html/gdb/2009-12/msg00004.html)

gdb 缺少 cos 函数的调试信息,因此假设它是一个 int cos(...) 函数,所以值没有正确返回(尤其是在 x86 上,因为存储浮点返回值和整数返回值的寄存器不同)。

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

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

关于c - gdb 在使用 math.h 函数时给出奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570196/

相关文章:

c - 结构体内部的 int 数组

c - stm32f103板不闪烁

c - 为指针结构赋值会导致段错误

调用连接需要太多时间

c++ - gdb 与 xxd 转储中的地址

linux - 添加 GDB 符号后应用程序运行缓慢 - 副作用?

c - 只阻塞消费者的单一生产者/消费者循环缓冲区

gdb - 在Gdb中如何将条件断点设置到函数的第三行

linux - 分析 Xen 核心转储

c - 试图从 "the art of exploitation"理解示例 char_array2.c