在调试 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 原型,我不确定。
好问题。
我正在使用 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 原型,我不确定。
好问题。