gcc 如何用dladdr()函数打印源文件名?

wgeznvg7  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(207)

我尝试使用dladdr()打印回溯追踪。以下代码片段中的info.dli_fname显示了一个ELF文件的文件名。请告诉我,是否可以在没有addr2linegdb帮助的情况下,通过编程解析并打印源文件的名称和行号?

代码:

void print_caller(void)
{
    int       rc = -1;
    Dl_info info = {0};
    void *pc =  __builtin_return_address(0);

    rc = dladdr(pc, &info);

    printf(" ==> %p: %s (in %s)\n", pc, info.dli_sname, info.dli_fname);
}

输出:

$ ./a.out 
 ==> 0x55a6b04a1589: foo2 (in ./a.out)
lqfhib0f

lqfhib0f1#

告诉我是否有可能解析和打印源文件的名称和行号
这绝对是 * 可能的 * --addr2linegdb做到了。
但这并不简单--它需要理解和解码(可能是多种)复杂的调试信息格式。
如果您只关心一个平台(看起来像Linux),那么事情就简单一点--您只需要解码DWARF
但是这种格式 * 仍然 * 相当复杂。你应该从一个助手库开始,比如libdwarf

相关问题