用 GDB 调试 Segmentation Fault

今天写程序的时候出了一个 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值