如何在不进行痛苦的类型转换的情况下评估 GDB 中的函数?

How to evaluate functions in GDB without painful typecasting?

an answer to How to evaluate functions in GDB? 中,我找到了从 GDB 中调用程序外部名为 floor 的函数的方法,如下所示:

(gdb) p floor
 = {<text variable, no debug info>} 0x38e10197b0 <floor>
(gdb) p ((double(*)(double))floor)(2.9999)
 = 2
(gdb) p ((double(*)(double))floor)(2.000001)
 = 2
(gdb) 

我需要做什么,简短 编译器升级目前对我来说不是一个选项,以便让我以与在原始 C/C++ 文本文件中相同的方式调用该函数,例如:

p floor(2.9999)

具体来说,我想 必须打开 floor 上的手册页才能找到函数签名:

double floor(double x);

然后编造一个表达式以提供给 gdb 的 print 命令,该命令是一个指针接受 double 返回 double,带有很多括号。

那么,这是我们在 GDB 中调用这些类型的低级函数的唯一方法吗?还是我缺少什么?是因为我根本没有加载某种类型的 "debug symbols" 或类似的东西吗?在上面的输出中引用 no debug info 让我相信也许我的机器缺少一些 "debug symbols" 的包或允许我在本机 C 或 C++ 中表达它的等价物?

这是专门针对 Linux 的。我对与平台无关的答案不感兴趣,因为它们与我的用例无关(不过一般而言,仅针对此问题)。

What do I need to do

您应该为 libc 安装 libc6-dbg 或类似的调试符号包(floorlibm 中,它是 GLIBC 的一部分)。

没有调试符号,GDB 不知道 floor 的类型是什么。