2010-09-22 115 views
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()的方法吗?我已经看到/使用了像#define ing my_api_call这样的技巧作为在__FILE____LINE__宏中传递的函数调用。我想知道是否有一种方法可以在运行时而不是编译时访问这些信息(假设它存在)? Valgrind不会像这样做,以获得它返回的信息吗?

回答

5

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

+1

+1。如果我没有看到它,这是我回答的一半。另一半是Windows的可执行文件,你可以使用DbgHelp.lib(aka DebugHelp)来查看。请参阅http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx – 2010-09-22 19:22:36

1

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

+0

我一直在想,但可能只会在Linux上这样做。 – jdizzle 2010-09-22 19:21:22

0

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

您可能会或可能不知道可执行文件名(argv[0]不需要有程序名称的完整路径,或确有任何在它有用的信息 - 见here了解详细信息)。

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

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

这就是漫长的答案。简单的答案是,您应该可以像过去一样依靠传入__FILE____LINE__。它更便携可靠。

相关问题