常用命令
命令 | 描述 |
start | 开始执行程序,并停在main函数的第一条语句处 |
run(r) arg | 使用arg参数运行程序 |
finish | 继续运行到当前函数返回为止 |
quit(q) | 退出gdb调试环境 |
list(l) | 列出源代码,接着上次的位置,每次列10行 |
list 行号 | 列出从第几行开始的源代码 |
list 函数名 | 列出某个函数的源代码 |
print(p) var | 打印变量的值 |
set var | 修改变量的值 |
break(b) 行号或函数名 | 设置断点 |
step(s) | 执行下一行语句,如果有函数则进入到函数中 |
next(n) | 执行下一行语句 |
continue(c) | 继续运行 |
回车 | 重复执行上一次的命令 |
启动GDB
在使用gdb调试的可执行文件在编译时需要加-g选项,否则将看不见程序的函数名、变量名。
1. gdb <program> 调试当前目录下的program程序
2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3. gdb <program> <PID> 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
一个例子
源代码
#include <stdio.h> int add_range(int low,int high) { int i,sum; for(i=low;i<=high;++i) sum+=i; return sum; } int main(void) { printf("1+2+3+...+10=%d\n",add_range(1,10)); return 0; }
使用gcc编译程序
gcc -g test.c -o test
运行程序,可以得到下面的结果
使用gdb调试程序
gdb test
使用start运行程序,程序将执行到printf语句
使用step(s)执行下一步,将进入add_range函数。接着执行print(p) sum打印sum的值,可见程序出错是因为sum没有被初始化。
使用set var修改sum的值,键入finish命令继续执行,可见该函数已经返回正确的值了。