<分区>
我正在使用 gdb 调试 C++ (mex) 程序。在代码中有一个语句,其中一个变量被赋予了另一个变量的舍入值。例如:
x = round(y);
赋值工作正常,当我在 gdb 提示符下调用 (gdb) print x
时,打印了正确的值。但是,当我调用 (gdb) print round(y)
时,打印了一个奇怪的任意数字。
知道这种奇怪行为的来源是什么吗?
<分区>
我正在使用 gdb 调试 C++ (mex) 程序。在代码中有一个语句,其中一个变量被赋予了另一个变量的舍入值。例如:
x = round(y);
赋值工作正常,当我在 gdb 提示符下调用 (gdb) print x
时,打印了正确的值。但是,当我调用 (gdb) print round(y)
时,打印了一个奇怪的任意数字。
知道这种奇怪行为的来源是什么吗?
最佳答案
我能够在 Ubuntu 上重现这种奇怪的现象。 gdb 在双输入和双返回值方面遇到问题。
调用 __round 似乎有一个简单的解决方法。
(gdb) p round
$6 = {<text variable, no debug info>} 0x7ffff77f7460 <__round>
(gdb) p round(1.3)
$7 = -858993460
(gdb) p __round(1.3)
$8 = 1
(gdb) p __round
$9 = {double (double)} 0x7ffff77f7460
请注意,__round 的 gdb 原型(prototype)看起来是正确的,而 round 的参数类型信息缺失。因此,输入/输出似乎被视为要舍入的整数。
round 的手册页说如果 x 是整数那么它会被直接返回。如果我们假设 gdb 正在将 double 转换为 int,那么它会解释输出。
11 double y = 1.3;
(gdb) n
13 int k = round(y);
(gdb) p /x round(y)
$28 = 0xcccccccd
(gdb) p /lx *(long*)&y
$29 = 0x3ff4cccccccccccd
(gdb)
因此 gdb 将输入值截断为 32 位 int 并将一个 int 发送给 round,round 将其立即发回。因此,double 的低位字是输出。或者它可能将返回值截断为 32 位,结果相同。
至于为什么 gdb 没有合适的 round 原型(prototype),我不确定。
好问题。
关于c++ - 在调试 C++ 程序期间调用 round() 函数时,GDB 打印任意值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255612/