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

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

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 ing my_api_call这样的技巧作为函数调用传入__FILE____LINE__宏。 我想知道是否有办法在运行时而不是编译时访问该信息(假设它存在)? 像Valgrind这样的东西是不是必须做这样的事情才能获得它返回的信息?

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

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

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

您可能知道也可能不知道可执行文件名( argv[0]不需要具有程序名称的完整路径,或者确实包含任何有用的信息 – 有关详细信息,请参阅此处 )。

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

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

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