GDB的基本用法
gdb是个异常强大的命令行调试工具。需要在编译时加上-g选项,如:
linux$gcc -g test.c -o test
基本用法:
1,启动gdb,最简单的形式
linux$gdb ./test
2,显示代码,默认10行,可通过附加+或-,分别表示前向打印或后向打印,默认前向打印(这里看你怎么理解‘前’和‘后’的)
(gdb)list #简写形式--> l
3,按回车键,重复上一次的命令
4,设置断点,可以是指定的函数名,也可以是任意的一行,还可以附带条件
1 (gdb)break filename:func #简写形式--> b 2 (gdb)break filename:line #如果是当前文件,则不需要指定文件名 3 (gdb)break 21 if var==0 #或者分两步走,比如,已经设置了断点break 10,且断点编号为2, 4 #则可: condition 2 if var > 1
5,运行程序
1 (gdb)run #简写形式--> r 2 (gdb)run < input #可以重定向标准输入或输出
6,单步调试
1 (gdb)next #--> n 不进入函数体 2 (gdb)n i #单步执行i次 3 (gdb)step #--> s 进入函数体 4 (gdb)s i #单步i次
7,从当前位置直接运行到下一个断点,或等待输入时,或直到程序终止
(gdb)continue #--> c
8,显示堆栈信息(函数调用关系)
(gdb)backtrace #--> bt
9,显示详细的环境信息
1 (gdb)info frame #显示当前栈帧的详细信息(包括栈帧的地址、寄存器的值、调用当前函数的地址、开发语言、形参及局部变量在栈中的位置等) 2 (gdb)info locals #显示局部变量,(注意,当某个命令想不起来了,记住首字母,然后按Tab键) 3 (gdb)info breakpoints #显示断点信息 4 (gdb)info watchpoints #显示观察点信息,实际上可能与上一个命令重复
10,打印某个指定的变量
1 (gdb)print var #--> p 2 (gdb)print arr[0]@length #打印数组
11,设置观察点,一般观察某个表达式(变量也是表达式)
1 (gdb)watch expr #当表达式的值发生变化时,程序会停下来,并打印变化的信息 2 (gdb)watch var #当变量的值发生变换时,停住 3 (gdb)rwatch var #当变量被读时 4 (gdb)awatch var #当变量被读或被写时
12,设置捕捉点,捕捉程序运行时发生的一些事件,比如C++异常或加载共享库
(gdb)catch Event #详细请见http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
13,维护停止点(断点、观察点、捕捉点)
1 (gdb)delete #删除所有的已设置的停止点 2 (gdb)clear #清除当前停下来的断点,如果有的话,也可以具体指定,如:clear func, clear line... 3 (gdb)disable #暂时废除某停止点 4 (gdb)enable #重新激活被废除的停止点
14,退出当前函数体
(gdb)finish #注意在main函数(最外层)中没意义
15,退出循环体
(gdb)until #--> u
浙公网安备 33010602011771号