利用C++实现自定义的堆栈跟踪工具

   2024-09-30 9870
核心提示:在C++中,你可以使用backtrace和backtrace_symbols函数来获取当前线程的堆栈跟踪信息#includeiostream#include execinfo.h#inclu

在C++中,你可以使用backtracebacktrace_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函数,该函数使用backtracebacktrace_symbols来获取并打印当前线程的堆栈跟踪信息。然后,我们定义了一个handleSegfault函数,该函数将在发生段错误(如空指针解引用)时被调用。在main函数中,我们设置了一个信号处理器,以便在发生段错误时调用handleSegfault函数。最后,我们故意导致一个段错误,以便演示堆栈跟踪工具的功能。

请注意,这个示例仅适用于支持backtracebacktrace_symbols函数的系统,如Linux和macOS。在Windows上,你需要使用其他方法来获取堆栈跟踪信息,如CaptureStackBackTraceSymFromAddr函数。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号