本来有visualgdb是把gdb的相关操作略过了。但是今天调试程序的时候说找不到exit.c文件,不知道是不是因为没有在linux本地调试的原因,于是简单学习一下gdb,以备不时之需。
gcc -g main.c -o gdbtest
这样会生成一个gdb调试的文件,注意后面使用一定要用这个文件,刚才通过gdb打开文件打开错了,出了莫名其妙的错误。
进入gcc环境内以后,
(gdb)file xxx //调试xxx程序
(gdb) list 10 //显示参数(10)所在的行数的前后各5行内容
(gdb)list 2,6 //显示从2到6行的内容
(gdb) run //运行程序
(gdb) break x (if i=1)//在第x行加上断点 x可以为行号,也可以为函数名;还可以再添加特定条件,适用于for循环等情况。
(gdb)info break//查看断点信息
(gdb)delete breakpoint n//删除n号断点,标号要通过上一条指令查询
(gdb)enable/disable breakpoint n
(gdb)clear//运行过程中,直接输入clear,清除当前位置的断点。或者后面加上行号来清除某一行的断点
(gdb)continue //继续执行
学到这里,本来我是以为visualgdb看不见子进程是没有本地调试的锅,结果发现直接用gdb还真的而是和visualgdb一模一样的。关于子进程的调试,决定再写篇博文。
(gdb)print <name>//输出变量名
(gdb)set <name>=2//设置变量,为了防止和gdb的参数冲突,一般要用set var <name>
print后可以加输出格式的限定
[cce]/x十六进制;/d十进制;/u十六进制无符号整型; /o八进制;/t二进制;/a十六进制;/c字符;/f浮点[/cce]
(gdb)print *array@len//输出以array开始的len长度的内存空间的内容
(gdb)next 逐过程
(gdb)step逐语句
(gdb)jump跳转到某一行继续执行
(gdb) examine /nfu <adress> 可以缩写为x
(gdb)display /fmt expr自动显示