C ++函数地址 - 使用dladdr和backtrace()

时间:2016-12-23 07:49:36

标签: c++ backtrace dladdr

我想使用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()中有不同地映射成员函数地址的东西吗?

编辑:重新说明并提供更多代码示例来解释问题。

0 个答案:

没有答案