在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
函數。