gdb调试工具
查看帮助一是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(数字表示行数)。break(b) 设置断点,b 2,b main。
info break(i b) 查看断点信息。
watch 观察变量,相当于在变量处设置了断点。
continue(c) 继续程序运行,直到下一个断点,配合watch使用,因为watch实际上就是设置了断点。
step(s) 单步跟踪,类似于VC中的step in。next(n) 单步跟踪,类似于VC中的step out。
finish 运行程序,直到当前函数返回。
until(u) 退出循环。
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]); */ return 0; }gcc -Wall -g main.c -o main 没有错误
./main 出现Segmentation fault (core dumped),产生core文件
gdb main
r 会显示出错的代码
bt 会知道代码所在的函数
同理,
gdb main core
r 会显示出错的代码
bt 会知道代码所在的函数