如何在不进行痛苦的类型转换的情况下评估 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
或类似的调试符号包(floor
在 libm
中,它是 GLIBC 的一部分)。
没有调试符号,GDB 不知道 floor
的类型是什么。
在 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
或类似的调试符号包(floor
在 libm
中,它是 GLIBC 的一部分)。
没有调试符号,GDB 不知道 floor
的类型是什么。