3

这是一些示例代码,可以让您了解我想要什么。

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

4

3 回答 3

5

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

于 2010-09-22T19:13:33.377 回答
1

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

于 2010-09-22T19:11:27.977 回答
0

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

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

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

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

这是很长的答案。__FILE__简短的回答是,您可能应该像过去一样依赖传入__LINE__。它更便携,更可靠。

于 2010-09-22T19:18:33.107 回答