查看帮助一是man 命令,二是进入www.gnu.org,找到gdb的帮助文档(更详细)。
gcc -Wall -g main.c -o main,只有这样才能产生调试信息,包括core的调试信息。
一、常用命令
run(r) 运行,执行到断点,重新用r,表示重新开始执行。
list(l) 列出源代码,l 2,l main,l 2,16(数字表示行数)。info break(i b) 查看断点信息。
watch 观察变量,相当于在变量处设置了断点。
continue(c) 继续程序运行,直到下一个断点,配合watch使用,因为watch实际上就是设置了断点。
step(s) 单步跟踪,类似于VC中的step in。print(p) 查看运行时的变量以及表达式。
print(p) array 查看数组,print(p) array[1],查看数组第2个元素。
print(p) *array@len 查看动态内存。
print(p) x=5 改变运行时数据。
二、Segmentation fault (core dumped) 段错误
段错误是由于访问非法地址内存而产生的错误。在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump。
ulimit -c 查看core-dump状态,如果为0,则不产生core文件。
ulimit -a 查看core文件占的大小。
ulimit -c unlimited(或数字) 设置后,产生core文件。
以下main.c由于访问了非法地址内存产生了段错误:
#include <stdio.h> #include <stdlib.h> void segfault() { int *p = NULL; *p = 100; } int main(void) { segfault(); /* char buf[1] = "a"; buf[10003] = 'A'; printf("%c\n",buf[10003]); */ /* char* c = "hello"; c[3] = 'k'; */ return 0; }
gcc -Wall -g main.c -o main 没有错误
./main 出现Segmentation fault (core dumped),产生core文件
gdb main
r 会显示出错的代码
bt 会知道代码所在的函数
同理,
gdb main core
r 会显示出错的代码
bt 会知道代码所在的函数