龙空技术网

如何获取 C 语言程序段错误时的调用栈信息

编程黑科技 206

前言:

而今看官们对“c语言文件读取代码”大致比较注重,兄弟们都想要学习一些“c语言文件读取代码”的相关内容。那么小编也在网络上收集了一些对于“c语言文件读取代码””的相关知识,希望我们能喜欢,同学们一起来学习一下吧!

C 语言程序由于段错误发生复位时,调用栈信息非常有利于问题定位。基于此述求,我们可以在程序中接管 SGISEGV 信号,在信号处理函数中打印或保存调用栈信息即可实现。

// 文件名: backtrace.c#include <execinfo.h>#include <stdlib.h>#include <stdio.h>#include <signal.h>#include <fcntl.h>#include <unistd.h>#define FRAME_SIZE 100void dump(int signum) {    printf("signum: %d\n", signum);    const int size = FRAME_SIZE;    void *buffer[size];    int stack_size = backtrace(buffer, size);    // 打印信息到终端    char **stacktrace = backtrace_symbols(buffer, stack_size);    if (stacktrace) {        for (int i = 0; i < stack_size; ++i) {            printf("%s\n", stacktrace[i]);        }        free(stacktrace);    }        // 保存信息到文件    char core_name[64] = {};    snprintf(core_name, 64, "core.%d", getpid());    int fd = open(core_name, 'w');    if (fd) {        backtrace_symbols_fd(buffer, stack_size, fd);        close(fd);    }        exit(0);} void test1() {    // 模拟一个 SIGSEGV 信号    int *a = NULL;    *a = 1;}void test2() {    test1();}void test3() {    test2();}int main(int argc, char const *argv[]){    signal(SIGSEGV, dump);    test3();    return 0;}

编译及运行指令如下:

gcc -rdynamic backtrace.c -o backtrace -g && ./backtrace

标签: #c语言文件读取代码