c++ 打印堆栈信息
时间: 2023-06-29 08:13:54 浏览: 205
在C++中,可以使用`backtrace()`函数和`dladdr()`函数来打印堆栈信息。
```c++
#include <execinfo.h>
#include <cxxabi.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <dlfcn.h>
void printStackTrace() {
void* trace[256];
int traceSize = backtrace(trace, 256);
char** messages = backtrace_symbols(trace, traceSize);
for (int i = 1; i < traceSize; ++i) {
Dl_info info;
dladdr(trace[i], &info);
char* demangled = nullptr;
int status = 0;
demangled = abi::__cxa_demangle(info.dli_sname, nullptr, 0, &status);
printf("[bt]: (%d) %s (%s + 0x%lx)\n", i, messages[i], (status==0 ? demangled : info.dli_sname), (char*)trace[i] - (char*)info.dli_saddr);
free(demangled);
}
free(messages);
}
```
`backtrace()`函数可以获取当前堆栈信息,返回值为当前堆栈中函数调用的地址列表。而`backtrace_symbols()`则将地址列表转换为函数名和偏移地址的字符串数组。`dladdr()`函数可以获取给定地址的符号信息,包括函数名、地址和共享库信息。最后通过`abi::__cxa_demangle()`函数将符号名进行解析,得到可读的函数名。
需要注意的是,如果使用了代码混淆功能,`abi::__cxa_demangle()`函数可能无法正确解析函数名。此时可以直接使用`info.dli_sname`获取到的函数名进行打印。
阅读全文