用 GDB 调试 Segmentation Fault

本文记录了一次遭遇Segmentation Fault后的调试过程,通过GDB进行编译准备和调试,最终定位并解决了问题。
摘要由CSDN通过智能技术生成

今天写程序的时候出了一个 Segmentation Fault,于是把整个调试过程记录在这里了,精简过后的问题代码如下:

#include <stdio.h>

int main()
{
        FILE *fin = fopen ("r", "milk3.in");
        FILE *fout = fopen ("w", "milk3.out");
        int volume[3], milk[3];
        fscanf (fin, "%d%d%d", volume, volume + 1, volume + 2);
        milk[0] = milk[1] = 0;
        milk[2] = volume[2];
        return 0;
}

我想程序的问题是显而易见的,参数明显的错误,本人不禁汗颜。。。


编译和准备

用于调试的代码在编译的时候一定要加上调试信息,否则的话无法逐行调试,我想这对于大家来说是很可怕的吧,毕竟调的不是汇编代码。对于 GCC 编译器,只需要加上 -g 选项就可以了,用 GDB 调试的话,也可写成 -ggdb 不过这样的话可能导致其他调试器无法识别调试信息,而 GDB 的调试功能则有优化(不过博主从未感受到这个优化的效果)。
另外一点是保存内核的 coredump 信息。简言之,使用命令:
ulimit -c umlimited
博主的系统默认的选择是
ulimit -c 0
即不保存 coredump 以防硬盘被意外塞满,但编译程序的时候强烈建议修改之。

进入 GDB

直接写终端的输出:
liu@liu-laptop:~/Sandbox/c$ ls
tmp.c
liu@liu-laptop:~/Sandbox/c$ gcc -ggdb -W -Wall tmp.c
tmp.c: In function ‘mai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值