gpt4 book ai didi

ubuntu - 无法在调试器中调用标准数学函数?

转载 作者:行者123 更新时间:2023-12-04 18:28:25 28 4
gpt4 key购买 nike

我试图在调试器中调用我自己的函数和标准函数:

#include<stdlib.h>
#include<math.h>
#include<stdio.h>
int i=3;
void f(){
++i;
printf("%d\n",i);
}
int main(){
++i;
int j=i+2;
double d=cos(0.0);
printf("%f\n",d);
return 0;
}

编译这个程序并运行,它会像我预期的那样打印“1.000000”。
在 gdb 中,我尝试过:
(gdb) b main
Breakpoint 1 at 0x40055b: file x.c, line 10.
(gdb) r
Starting program: /home/x/a.out

Breakpoint 1, main () at x.c:10
10 ++i;
(gdb) call f()
4
(gdb) call f()
5
(gdb) call cos(0.0)
No symbol "cos" in current context. # WHY?????
(gdb) call printf("%d\n",i)
5
$1 = 2
(gdb) call putchar('a')
$2 = 97

为什么 gdb 甚至找不到符号?我想“-g”选项将为我的程序和标准库带来调试信息,对吧?还是我必须为标准库的调试/源代码安装额外的包?我在 ubuntu16.04

非常感谢。

最佳答案

尽管立即出现,但 gdb 的这一部分运行良好。所以我的第一直觉是我们处于某种 GIGO 情况——gdb 异常容易受到编译器和内核的敌对行为的影响——因此需要进行一些调查。

您没有说您使用的是 C 还是 C++。

在 C++ 中,我可以看到没有为 cos 发出调试信息。 , 并且调用被完全优化掉了。您可以通过运行 nm 来检查。并注意到 cos不显示为 undefined symbol ;或者只是注意到这个程序在没有 -lm 的情况下链接得很好.

我对 C++ 的理论是,发生这种情况是因为有一个 constexpr cos 的版本在范围内(我在预处理输出中看到它,但我没有尝试真正验证),因此 g++ 优化了整个调用。

对于 C,我默认看到相同的东西。但是,我可以调用 cos 的电话。通过 -fno-builtin-cos到海湾合作委员会。但是,哈哈,它仍然不在调试信息中!

这对我来说似乎是一个 gcc 错误。通常,您不需要库的 debuginfo 来访问程序使用的库中的类型或函数。

您还可以通过尝试打印函数本身来注意到发生了一些奇怪的事情:

(gdb) p cos
$1 = {<text gnu-indirect-function variable, no debug info>} 0x7ffff7aebc50 <cos>

这是一个双重坏消息,因为“GNU 间接”函数是魔法生物,gdb 并不总是能正确理解。特别是我认为即使安装了 debuginfo 也不能从调试器中调用它们。

事实上,我唯一能做的就是获取 cos 的地址。在程序中,然后通过该指针调用,例如:
mumble *my_cos = &cos;
...
(gdb) print my_cos(0.0)

嗯,这并不完全正确。我也可以完成这项工作:
(gdb) info func cos@plt
All functions matching regular expression "cos@plt":

Non-debugging symbols:
0x0000000000400500 cos@plt
(gdb) p ((double(*)(double))0x0000000000400500)(0.0)
$6 = 1

这避免了 GNU 间接的东西。然而,这很不愉快。

关于ubuntu - 无法在调试器中调用标准数学函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167748/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com