如何评估GDB中的功能?

Tim*_*Tim 29 evaluation gdb function

我想知道为什么评估函数在gdb中不起作用?在我的源文件中包含,当在gdb中调试时,这些示例是错误的评估.

(gdb) p pow(3,2)

$10 = 1

(gdb) p pow(3,3)

$11 = 1

(gdb) p sqrt(9)

$12 = 0
Run Code Online (Sandbox Code Playgroud)

小智 21

除了给参数提供正确的类型之外,你需要告诉gdb它将在浮点寄存器中找到返回值,而不是正常寄存器.

即:

(gdb)p((double(*)())pow)(2,2.)

1美元= 4美元


Isa*_*avo 19

我的猜测是编译器和链接器对这些特定的函数做了一些魔术.最有可能提高性能.

如果您绝对需要pow()在gdb中可用,那么您可以创建自己的包装函数:

double mypow(double a, double b)
{
    return pow(a,b);
}
Run Code Online (Sandbox Code Playgroud)

也许还将它包装成一个#ifdef DEBUG或者什么东西,以免弄乱最终的二进制文件.

顺便说一句,您会注意到可以调用其他库函数(并打印它们的返回值),例如:

(gdb) print printf("hello world")
$4 = 11
Run Code Online (Sandbox Code Playgroud)

  • 正确答案由 anon 在下面给出 (4认同)

Cha*_*ant 18

在gdb中调用函数的语法是

call pow(3,2)
Run Code Online (Sandbox Code Playgroud)

类型

help call
Run Code Online (Sandbox Code Playgroud)

在gdb提示符下获取更多信息.

  • print 也会调用函数。事实上,我认为唯一的区别是调用 void 函数时调用不会使输出混乱 (2认同)

小智 5

实际上,至少在我的 gcc 的 LINUX 实现中,许多数学函数被替换为特定于其参数类型的变体,通过 math.h 和 bits/mathcalls.h(包含在 math.h 中)引入的一些奇特的替换)。因此,像 pow 和 exp 这样的函数被称为__powor *__GI___exp(您的结果可能会因参数类型和特定版本而异)。

为了确定链接到我的代码中的函数究竟是什么,我在调用该函数的行处放置了一个中断,例如,在我的代码中有一行带有b=exp(c);. 然后我在 gdb 中运行直到那个断点,然后使用“step”命令从该行输入调用。然后我可以使用“where”命令来识别被调用例程的名称。就我而言,那是*__GI___exp.

可能有更聪明的方法来获取此信息,但是,我无法仅通过单独运行预处理器(-E 选项)或查看生成的汇编代码 (-s) 来找到正确的名称。

  • 我知道这是旧的,但如果有人来看,这里是:对我来说,它只做`p pow`它给了我:`$28 = {<text variable, no debug info>} 0x7ffff77ffbd0 <__pow>` (2认同)