今天写程序的时候出了一个 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