有没有办法在运行时访问调试符号?

时间:2010-09-22 19:05:17

标签: c runtime debug-symbols

这是一些示例代码,用于了解我想要的内容。

int regular_function(void)
{
     int x,y,z;
     /** do some stuff **/
     my_api_call();
     return x;
}
...
void my_api_call(void)
{
    char* caller = get_caller_file();
    int line = get_caller_line();
    printf("I was called from %s:%d\n", caller, line);
}

有没有办法实施get_caller_file()get_caller_line()?我已经看到/使用#define my_api_call之类的技巧作为传递__FILE____LINE__宏的函数调用。我想知道是否有办法在运行时而不是编译时访问该信息(假设它存在)?像Valgrind这样的东西不会做这样的事情以获得它返回的信息吗?

3 个答案:

答案 0 :(得分:5)

如果您使用调试符号编译了二进制文件,则可以使用特殊库访问它,例如libdwarf用于DWARF调试格式。

答案 1 :(得分:1)

这是高度环境特定的。在提供调试符号的大多数Windows和Linux实现中,工具供应商提供或记录了这样做的方法。要获得更好的答案,请提供实施细节。

答案 2 :(得分:0)

调试符号(如果可用)需要存储在某处,以便调试器可以获取它们。它们可能存储也可能不存储在可执行文件中。

您可能知道或不知道可执行文件名(argv[0]不需要具有程序名称的完整路径,或者确实包含任何有用信息 - 请参阅{ {3}}了解详情。

即使您可以找到调试符号,您也必须解码它们以尝试找出您的调用位置。

您的代码可能会被优化到信息无用的程度。

这是一个很长的答案。简短的回答是,您可能应该依赖于传递__FILE____LINE__。它更便携可靠。