阅读量:0
在C++中,你可以使用backtrace
和backtrace_symbols
函数来获取当前线程的堆栈跟踪信息
#include<iostream> #include <execinfo.h> #include<signal.h> #include <unistd.h> #include <cstdlib> const int MAX_STACK_FRAMES = 64; void printStackTrace() { void* stackFrames[MAX_STACK_FRAMES]; int numFrames = backtrace(stackFrames, MAX_STACK_FRAMES); char** symbols = backtrace_symbols(stackFrames, numFrames); std::cout << "Stack trace:"<< std::endl; for (int i = 0; i < numFrames; ++i) { std::cout<< symbols[i]<< std::endl; } free(symbols); } void handleSegfault(int sig) { std::cerr << "Segmentation fault caught."<< std::endl; printStackTrace(); _exit(1); } int main() { signal(SIGSEGV, handleSegfault); // Example of a function that will cause a segmentation fault char* ptr = nullptr; *ptr = 'a'; return 0; }
这个示例中,我们首先定义了一个printStackTrace
函数,该函数使用backtrace
和backtrace_symbols
来获取并打印当前线程的堆栈跟踪信息。然后,我们定义了一个handleSegfault
函数,该函数将在发生段错误(如空指针解引用)时被调用。在main
函数中,我们设置了一个信号处理器,以便在发生段错误时调用handleSegfault
函数。最后,我们故意导致一个段错误,以便演示堆栈跟踪工具的功能。
请注意,这个示例仅适用于支持backtrace
和backtrace_symbols
函数的系统,如Linux和macOS。在Windows上,你需要使用其他方法来获取堆栈跟踪信息,如CaptureStackBackTrace
和SymFromAddr
函数。