捕获Linux段错误(Segment fault)并且打印错误堆栈

本文介绍了一种在Linux服务器上高效捕捉程序崩溃的方法。通过设置SIGSEGV信号处理函数,利用gdb进行堆栈回溯,从而快速定位难以复现的bug。此方法接近于Windows下的VC调试体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux上跑服务器如果遇到程序崩溃是一件很苦恼的事情, 再碰到重现很难的BUG, 估计只能通过传统的排查方法进行.

在编写本文前, 笔者使用过诸如libunwind等库进行错误时堆栈打印, 但是其本身由于需要引用第三方库, 使用还是稍微麻烦.

经过Google后, 居然找到一篇好文, 其通过捕获SIGSEGV信号, 并迫使程序进入gdb调试阶段, 利用gdb强大的调试功能可以进行各种错误跟踪, 此法已与Windows下程序崩溃后弹出VC调试几乎接近.

我在此文基础上, 扩展了其通用性及便利性

1. 使用gdb的 -ex参数, 在挂接程序后, 执行bt指令打出程序堆栈

2. 将信息重定向到自定义的文件,在多进程都需要进行后台输出时带来更大的灵活性, 同时也解决了gdb只能在前台调试的问题

代码如下

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void dump(int signo)
{
        char buf[1024];
        char cmd[1024];
        FILE *fh;

        snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
        if(!(fh = fopen(buf, "r")))
                exit(0);
        if(!fgets(buf, sizeof(buf), fh))
                exit(0);
        fclose(fh);
        if(buf[strlen(buf) - 1] == '/n')
                buf[strlen(buf) - 1] = '/0';
        snprintf(cmd, sizeof(cmd), "gdb %s %d -ex=bt > ./a.txt", buf, getpid());
        system(cmd);

        exit(0);
}

在服务器开启时,添加 signal(SIGSEGV, &dump ); 进行信号处理挂接即可

Python本身并不直接提供捕获类似于C/C++中Segmentation Fault段错误)异常的功能,因为这种错误通常是由于底层内存访问违规引起的,并不是由解释型语言如Python正常处理的部分。 但是,在某些特定场景下你可以采取间接的方式应对这种情况: ### 使用`faulthandler` 对于调试目的来说,可以利用`faulthandler`模块帮助你当程序遇到致命信号时打印出Python的追踪信息。这有助于开发者了解发生崩溃的具体位置。 ```python import faulthandler # 启用将跟踪回溯写入标准错误faulthandler.enable() def some_function(): # 模拟可能会导致崩溃的操作... pass some_function() ``` 一旦启用了`faulthandler`,如果您的应用程序因接收到SIGSEGV等信号而终止,则会自动输出当前线程正在执行的代码的位置和其他有用的信息。 ### C扩展库保护机制 如果你是在编写嵌入了Python的C或Cython扩展模块并且担心其中可能出现段错误的话,那么可以在关键部分添加适当的检查并尝试优雅地恢复或记录日志而不是让整个进程立即退出。 此外还可以考虑使用像Valgrind这样的工具来检测和预防潜在的问题,尤其是在开发阶段。 需要注意的是,理想情况下应该尽量避免写出可能导致segment fault的应用逻辑;同时也要意识到并非所有类型的低级硬件/操作系统级别的故障都可以通过高层脚本语言层面有效地“捕捉”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值