有没有一种方法可以在运行时访问调试符号?

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()get_caller_line()?我见过/使用过一些技巧,比如将my_api_call定义为函数调用,传递__FILE____LINE__宏。我想知道是否有一种方法可以在运行时访问该信息(假设存在),而不是在编译时访问?难道像Valgrind这样的工具不必要做类似的事情才能得到它返回的信息吗?
3个回答

5

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


1
如果我没看错,这大概是我回答的一半。另外一半的答案是,如果你想要查看Windows可执行文件,你需要使用DbgHelp.lib(也称为DebugHelp)。请参考http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx。 - T.E.D.

1

这是高度特定于环境的。在大多数提供调试符号的Windows和Linux实现中,工具供应商提供或记录了一种方法来执行此操作。为了得到更好的答案,请提供具体的实现细节。


我是在一般情况下考虑的,但可能只会在Linux上执行。 - jdizzle

0

如果有的话,调试符号需要存储在某个地方,以便调试器可以访问它们。它们可能存储在可执行文件本身中,也可能不存储。

您可能不知道可执行文件的名称(argv[0] 不需要具有程序名称的完整路径,或者实际上没有任何有用的信息 - 有关详细信息,请参见 这里)。

即使您能够找到调试符号,您也必须对其进行解码,以尝试弄清楚从哪里调用了它们。

而且,您的代码可能已经优化到无法使用该信息的程度。

那是长答案。简短的答案是,您应该像以前一样依靠传递 __FILE____LINE__。这更加便携和可靠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接