这是一些示例代码,用于了解我想要的内容。
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这样的东西不会做这样的事情以获得它返回的信息吗?
答案 0 :(得分:5)
如果您使用调试符号编译了二进制文件,则可以使用特殊库访问它,例如libdwarf用于DWARF调试格式。
答案 1 :(得分:1)
这是高度环境特定的。在提供调试符号的大多数Windows和Linux实现中,工具供应商提供或记录了这样做的方法。要获得更好的答案,请提供实施细节。
答案 2 :(得分:0)
调试符号(如果可用)需要存储在某处,以便调试器可以获取它们。它们可能存储也可能不存储在可执行文件中。
您可能知道或不知道可执行文件名(argv[0]
不需要具有程序名称的完整路径,或者确实包含任何有用信息 - 请参阅{ {3}}了解详情。
即使您可以找到调试符号,您也必须解码它们以尝试找出您的调用位置。
您的代码可能会被优化到信息无用的程度。
这是一个很长的答案。简短的回答是,您可能应该依赖于传递__FILE__
和__LINE__
。它更便携可靠。