C语言 在运行时使用调试信息获取地址的源位置

2ic8powd  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(131)

在我的C程序中,我有一个指向虚拟内存中某个地址的指令指针,例如函数指针。我想在运行时使用执行的二进制文件中的调试信息将此地址Map到相应的源位置(文件路径、行号)。我知道GDB implements something like this,但我不确定如何为我的项目处理这个问题。
我知道addr2linellvm-symbolizer,但这两个工具都分析ELF文件中的地址,而不是已经加载到虚拟内存中的二进制文件。同样,这也不是How do I access the addr2line functionality within my C++ program?的副本

yb3bgrhw

yb3bgrhw1#

感谢Yakov Galka的评论,我找到了一个解决我想做的事情的方法:

#define __USE_GNU
#include <dlfcn.h>

// instruction address for which I want the source location
const void* code_addr = 0xabcdef;

// call dladdr to figure out base address in virtual memory
Dl_info info;
dladdr(code_addr, &info);

size_t base_address = (size_t) info.dli_fbase;
size_t relative_address = ((size_t) code_addr) - base_address;
// in my case: relative_address == 0x126c

然后,我可以调用addr2line来确定源位置。在我的例子中,所有东西都被喜欢到a.out中,所以我可以调用

addr2line --basenames -i -e tasks.out 0x126c

然后输出如下内容:

filename.c:42

相关问题