如何在C++程序崩溃时自动获取堆栈跟踪(stacktrace)?
大家好!我在Linux下使用GCC编译器编写C++,经常遇到难以调试的bug。程序会因segmentation fault崩溃,但我无法确定具体位置,因为崩溃很少发生且出现在随机位置。
我已经使用了assert,但当bug与内存损坏或缓冲区溢出相关时,它们没有帮助。我希望在任何崩溃(SIGSEGV、SIGABRT、SIGFPE等)时,程序能自动输出完整的堆栈调用,包括函数名、文件和行号。
以下是我的崩溃代码示例:
```cpp
#include
#include
void dangerous_function(int* ptr) {
*ptr = 42; // 如果ptr == nullptr,这里可能发生segfault
}
int main() {
std::vector vec(10);
int* bad_ptr = nullptr;
dangerous_function(bad_ptr); // 崩溃!
return 0;
}
```
我听说过backtrace()和backtrace_symbols(),但它们只输出地址,而不是可读的函数名。如何获取可读的堆栈信息?