我想使用 backtrace() 并获取函数地址以进行跟踪。我想在运行时存储来自 backtrace() 的函数地址,并在以后使用它进行分析(例如,使用 dladdr() 加载回函数名称、查看调用统计信息等)。这样做时,我试图查看类成员函数的静态地址。
Alib.so,啊:
class A
{
public:
void print_addr();
};
A.cpp
#include "A.h"
#include <iostream>
void A::print_addr()
{
std::cout << (void*)&A::print_addr << std::endl;
}
主文件
#include <iostream>
#include "Alib/A.h"
int main()
{
std::cout << (void*) &A::print_addr << std::endl;
// if put the line below, with the line above, output is the same
// It seems whenever the code pull in &A::print_addr into main, addr is
// always the same. Only different if print .so itself
// A a; a.print_address();
return;
}
这输出:
0x400870
如果我多次重新运行 main,它会给我相同的地址。如果我将 main.cpp 更改为此:
int main()
{
A a;
a.print_addr();
return 0;
}
每次我运行 main 可执行文件时,输出都是不同的,即使没有重新编译 .so 或 main:
0x7fae48524aa0
我检查这个的原因是我想使用 backtrace() 来获取当前堆栈函数的函数信息(地址)以进行跟踪,它的作用非常相似。我尝试在 .so 库函数中调用 backtrace(),并在当前堆栈函数上使用 backtrace() 和 dladdr() 获取函数的符号信息。在 .so 中打印函数地址与在 main 中执行它会给出不同的地址。如何使用 dladdr() 的函数地址来获取信息,例如符号名称?
在 .so 和 main() 中映射的类成员函数地址有什么不同吗?
编辑:重新措辞并提供更多代码示例来解释问题。