在调试 C++ 程序期间调用 round() 函数时,GDB 打印任意值

GDB prints arbitrary values when round() function called during debugging a C++ program

我正在使用 gdb 调试 C++ (mex) 程序。在代码中有一个语句,其中一个变量被赋予了另一个变量的舍入值。例如:

x = round(y);

赋值工作正常,当我在 gdb 提示符下调用时 (gdb) print x,打印了正确的值。但是,当我调用 (gdb) print round(y) 时,会打印一个奇怪的任意数字。

知道这种奇怪行为的根源是什么吗?

我能够在 Ubuntu 上重现这种奇怪的现象。 gdb 在处理双输入和双 return 值时遇到问题。

不过调用 __round.

似乎有一个简单的解决方法
(gdb) p round
 = {<text variable, no debug info>} 0x7ffff77f7460 <__round>
(gdb) p round(1.3)
 = -858993460
(gdb) p __round(1.3)
 = 1
(gdb) p __round
 = {double (double)} 0x7ffff77f7460 

请注意,__round 的 gdb 原型看起来是正确的,而 round 的参数类型信息缺失。结果,input/output 似乎被视为要舍入的整数。

round 的手册页说,如果 x 是整数,那么它将被直接 returned。如果我们假设 gdb 正在将 double 转换为 int,那么它会解释输出。

11    double y = 1.3;
(gdb) n
13    int k = round(y);
(gdb) p /x round(y)
 = 0xcccccccd
(gdb) p /lx *(long*)&y
 = 0x3ff4cccccccccccd
(gdb) 

因此 gdb 将输入值截断为 32 位 int 并将一个 int 发送到 round,round 将其立即发送回去。因此,double 的低位字是输出。或者它可能将 return 值截断为 32 位,结果相同。

至于为什么 gdb 没有合适的 round 原型,我不确定。

好问题。