1

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

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

4

0 回答 0