我尝试使用dladdr()
打印回溯追踪。以下代码片段中的info.dli_fname
显示了一个ELF文件的文件名。请告诉我,是否可以在没有addr2line
或gdb
帮助的情况下,通过编程解析并打印源文件的名称和行号?
代码:
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)
1条答案
按热度按时间lqfhib0f1#
告诉我是否有可能解析和打印源文件的名称和行号
这绝对是 * 可能的 * --
addr2line
和gdb
做到了。但这并不简单--它需要理解和解码(可能是多种)复杂的调试信息格式。
如果您只关心一个平台(看起来像Linux),那么事情就简单一点--您只需要解码DWARF。
但是这种格式 * 仍然 * 相当复杂。你应该从一个助手库开始,比如libdwarf。