如何用C语言的内存地址映射函数名和行号?

如何在GCC中将函数名和行号映射回内存地址?

即假设一个C语言的原型:

void func() { // Get the address of caller , maybe this could be avoided MemoryAddress = get_call_address(); // Which line from source code is executing , which calls func() LineNumber = get_lineno_from_symbol ( &MemoryAddress ); // Grab the name who calls func() FunctionName = get_func_from_symbol ( &MemoryAddress ); } 

那么GCC提供的任何现有的API或其他什么都可以满足我的要求?

非常感谢你们的答复;

Solutions Collecting From Web of "如何用C语言的内存地址映射函数名和行号?"

如果你包含标题

 #include <execinfo.h> 

那么可以使用backtrace()函数来确定调用行的地址,使用backtrace_symbols()来检索函数的名称。 但是,这不会给你行号(尽管它可以提供足够的信息来帮助调试,如果这是你所需要的)。

如果你确实需要行号,那么你需要:

  • 确保您的程序(及其所有库)在启用调试的情况下编译( -g标志为gcc)
  • 使用addr2line程序将地址(从backtrace()检索)转换为文件/行号引用。 例如,您可以使用system()从程序中调用此函数。 它会将输出发送到标准输出,但是如果需要,您可以使用重定向或管道捕获输出。

有了gcc,你可以使用回溯功能来做到这一点。