我想使用backtrace()并获取函数地址以进行跟踪。我想在运行时从backtrace()存储函数地址,并在以后使用它进行分析(例如,使用dladdr()来加载函数名称,查看调用统计信息等)。在这样做时,我试图查看类成员函数的静态地址。
Alib.so,A.h:
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;
}
的main.cpp
#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;
}
每次运行主可执行文件时输出都不同,即使没有重新编译.so或main:
0x7fae48524aa0
我检查这个的原因是我想使用backtrace()来获取当前堆栈函数上的函数信息(地址)以进行跟踪,它的行为非常相似。我尝试在.so库函数中调用backtrace(),并在当前堆栈函数上使用backtrace()和dladdr()获取函数的符号信息。在.so中打印函数地址与在main中打印函数地址会给出不同的地址。如何使用dladdr()的函数地址来获取信息,例如符号名称?
在.so和main()中有不同地映射成员函数地址的东西吗?
编辑:重新说明并提供更多代码示例来解释问题。