GUN工具集中的调试器是GDB(GUN Debugger) 该程序是一个交互工具,工作在字符模式,除GDB外,linux 下比较有名的调试器还有xxgdb,ddd,kgdb,ups
实践
#include <stdio.h>
int main(int argc,char **argv){
int i;
for(i=0;i<argc;i++){
printf("argv[%d]:%sn",i,argv[i]);
}
printf("nn");
return 0;
}
#将上述代码保存成 a.c 然后加 调试信息编译
gcc -g a.c -o a
# gdb file file 是指编译后的可执行文件
# set args 指定运行时的参数 set args 1,2,3
# show args 查看设置好的参数
# start 开始执行
# run 开始执行 如果有断点,则停在第一个断点处
# continue 往下走一个断点
# list func 显示 func 函数的源码
# list 5 显示第 5 行 上下各5行源码
# list 显示当前行后面10行源码
# list - 显示当前行前面10行源码
# set listsize 123 设置一次显示源码的行数为123行
# show listsize 查看当前 listszie 数据
# break 设置断点 可以简写为 b
# b 10 在源码第10行设置断点
# b func 在 func 函数入口处设置断点
# info break 显示所有断点 可以简写为 i b
# 多文件设置断点
# break a.c:10 在源文件 a.c 的第10行处设置断点
# break a.c:func 在源文件 a.c 的func 函数入口处设置断点
# break class::func 在类 class 的 func 函数入口处设置断点
# break func(type,type) 同上
# break namespace::class::func 在命名空间 namespace 的类 class 的 func 函数入口处设置断点
# 条件断点
# b a.c:10 if key==5 在源文件a.c 的第10行,如果key == 5 时,则加断点
# 维护断点
# delete [range...] 删除指定断点 简写为d 如果不指定参数 则删除所有断点 range 表示断点范围(如:3-7)
# 比删除更好的一种方法是 disable 停止点 disable 之后不会删除,当需要再使用时 enable 即可
# disable [range...] 使指定断点无效 简写为 dis 如果不指定 则 disable 所有
# enable [range...] 使无效断点生效 简写为 ena 如果不指定 则 enable 所有
# 调试代码
# run 运行程序 可简写为 r
# next 单步跟踪 函数调用当作一条语句执行 可简写为 n
# step 单步跟踪 函数调用进入被调用函数体内 可简写为 s
# finish 退出进入的函数
# until 在一个循环体内单步跟踪时 这个命令可以运行程序直到退出循环体 可简写为 u
# continue 继续运行 停在下一个断点的位置 可简写为 c
# quit 退出 gdb 可简写为 q
# 数据查看
# print 打印变量 字符串 表达式等 可简写为 p
# 自动显示
# display abc 显示变量 abc
# info display 查看display设置的自动显示的信息
# undisplay num 不显示对应的 display 信息
# disable display num 禁用对应编号的 display 信息
# enable display num 启用对应编号的 display 信息
# delete display num 删除对应的 display 信息
#查看和修改变量的值
# ptype abc 查看变量 abc 的数据类型
# p abc 查看变量 abc 的值
# set var abc=123 设置变量 abc 的值为123
#启动
gdb a
#设置参数
set args 1 2 3 4 "hello word"
#查看参数
show args
start
run
效果如下图
![9dc2a8e5b97b6ff3ed18a41027e694fa.png](https://i-blog.csdnimg.cn/blog_migrate/76edfa611fc6903bcbab9c6bc3cd13e8.jpeg)