有没有办法在运行时访问调试符号?
这是一些示例代码,用于了解我想要的内容。
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__
。 它更便携可靠。