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

标签 c++ gdb mex

<分区>

我正在使用 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/

相关文章:

c - 分配 :what can "corrupt" allocated memory in Linux/Qt application (threads involved)?

objective-c - Xcode 在调试时评估表达式

debugging - 为什么GDB在寄存器信息期间用5填充内存地址的0?

c++ - 为什么这个 CPP 文件在 mex -largeArrayDims 期间出错?

c++ - mysql 和 matlab mex - libmysqlcppconn 找不到 glibcxx_3.4.15

c - 为什么 cudaMalloc 返回非法内存访问

c++ - 如何使用 Boost.Geometry 检查一个环是否包含在另一个环中?

c++ - 递归创建 boost 属性树

c++ - 最烦人的解析

c++ - Qt 5.9 中的 Q_FLAG_NS 不提供按位运算符