cpp中如何打印堆栈调用信息
时间: 2024-10-25 10:08:49 浏览: 36
cpp打印调用堆栈
在 C++ 中,打印堆栈调用信息通常涉及到获取当前函数的调用链或者堆栈跟踪。这可以使用标准库提供的 `__PRETTY_FUNCTION__`、`typeid` 或第三方库如 `backtrace` 和 `libunwind` 来实现。
1. 使用 `__PRETTY_FUNCTION__`:
```cpp
#include <iostream>
#include <typeinfo>
void printStackTrace() {
for (int i = 0; ; i++) {
std::cout << "Function " << i << ": ";
auto func = typeid(std::current_function()).name();
std::cout << func << '\n';
if (func == "<null>") break;
}
}
int main() {
printStackTrace();
return 0;
}
```
这里,`std::current_function()` 返回当前正在运行的函数指针,`typeid` 会返回一个表示该函数类型的 `type_info` 对象,然后通过 `.name()` 获取名字并打印。
2. 使用 `backtrace` 和 `libunwind`(需要链接到相应的库):
```cpp
#include <execinfo.h> // backtrace
#include <stdio.h>
// 定义打印堆栈信息的回调函数
static void print_trace(void* trace[], size_t size, void* context) {
printf("Stack frame at %p:\n", trace[0]);
char** symbols = backtrace_symbols(trace, size);
for (size_t i = 0; i < size; i++)
printf("%s\n", symbols[i]);
free(symbols);
}
int main() {
void *array[10];
size_t size;
backtrace(array, 10); // 获取前10个堆栈帧
print_trace(array, size, NULL);
return 0;
}
```
这种方法需要处理内存分配和释放,并且不是C++的标准库功能。
阅读全文