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

dai*_*isy 2 c linux reflection debugging gcc

如何在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 );
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你的回应;-P

psm*_*ars 5

如果包含标题

#include <execinfo.h>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该backtrace()函数来确定调用行的地址,并backtrace_symbols()检索函数的名称.但是,这不会给你行号(虽然它可能提供足够的信息来帮助调试,如果这是你需要的).

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

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