今天在linux上调试代码的时候,突然发现里面的函数地址gdb 和什么不一样纳米 显示。 (可执行文件是静态链接的。)
我认为它们显示的地址应该是相同的,因为它们都是逻辑地址。但是今天的发现让我很困惑。
有人知道他们不同的原因吗?
我编写了以下简单程序来说明我遇到的情况。
void fo()
{
return ;
}
void foo()
{
fo();
}
int add(int a, int b)
{
foo();
return a + b;
}
int main()
{
int a = 1;
int b = 2;
add(a, b);
return 0;
}
的nm
输出是:
0000000000400584 T _Z2fov
0000000000400595 T _Z3addii
000000000040058a T _Z3foov
00000000004005b3 T main
但是当我使用 gdb 调试编译后的可执行文件时,将断点放在第 3 行。
(gdb) bt
#0 fo () at test.cpp:4
#1 0x0000000000400593 in foo () at test.cpp:9
#2 0x00000000004005a8 in add (a=1, b=2) at test.cpp:14
#3 0x00000000004005d8 in main () at test.cpp:22
你可以看到 gdb
的输出与nm
的不同 .
原因:
因为 nm
显示函数开始的地址,而gdb
堆栈跟踪显示函数内部执行的确切位置。确切地说,它应该是堆栈帧中的返回地址,即当堆栈中位于其上方的函数返回时,指向该函数中要执行的下一条指令的指针。
请注意,如果您只是询问 gdb
对于通过评估函数指针表达式的函数指针,它应该给出与 nm
相同的地址.