生成调试信息
GDB主要用于去调试c/c++程序。需要调试的c/c++程序,首先在编译时,我们必须要吧调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g参数。如果没有-g参数,你将看不见程序的函数名,变量名,所代替的全是运行时的内存地址。
启动GDB
- 使用命令gdb ./a.out
- 设置运行时参数
set args 可以指定运行时的参数。
show args 查看设置好的参数。 - 启动程序
run:程序开始执行,如果有断点,停在第一个断点处
start:程序向下执行一行
显示源代码
用list命令来打印程序的源代码,默认打印10行
- list linenum: 打印第linenum行的上下文内容
- list function:打印函数名为function的函数的源程序
- list:显示当前行后面的源程序
- list -:显示当前行前面的源程序。
一般时打印当前行的上5行和下5行,如果显示函数不是,可以设置一次显示源程序的行数。
- set listsize count:设置一次显示源程序的行数
- show listsize: 查看当前listsize的设置
断点操作
简单断点
break设置断点,可以简写为b
- b 10在第10行设置断点
- b func在func函数入口处设置断点
多文件设置断点
c++中可以使用class::function或function(type, type)格式来指定函数名。如果命名空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名.
- break filename:linume 在源文件filename的linenum行设置断点
- break filename:function 在源文件filename的function函数入口处设置断点
- break class::function 在类class的function函数处设置断点
- break namspace::class::function 在命名空间namespace的类class的function函数入口处设置断点
查询所有断点
- info b
- info break
- i break
- i b
条件断点
为断点设置一个条件,使用if关键字后面跟其断点条件.
设置一个条件断点:
在test.c文件中的第十行当value=5的时候停止
b test.c:10 if value==5
维护断点
- delete [range..]删除指定的断点,简写为d
如果不指定断点号,就表示删除所有的断点。range表示断点的范围(3-7).
- disable [range...]使断点无效,简写命令就是dis.
如果什么都不指定就是表是disable所有的断点。 - enable [range...]使无效断点生效,简写命令ena。
如果不指定,就表示enable所有的断点。
调试代码
- run 运行程序,简写为r
- next单步跟踪,函数调用当作一条简单语句执行,可简写为n
- step单步跟踪,函数进入被调用函数体内,简写为s
- finish退出函数
- until在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,简写为u
- continue继续运行程序,停在下一个断点的位置,简写为c
- quit退出gdb,简写为q
数据查看
查看运行时的数据 print count 打印变量count的值 简写为p
自动显示
设置一些自动显示的变量,当程序停止时,或者在单步时,这些变量会自动显示,相关GDB吗,命令时display。
- display变量名
- info display 查看display设置的自动显示的信息
- undiplay num (info display显示的编号)
- delete display dnums 删除自动显示,dnunms为设置号的自动显示的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除哦一个范围内的编号,可以用减号表示(如:2-5)
- disable display dnums
- enable display dnums
disable 和 enable 不删除自动显示的设置,而是让其失效或恢复
查看修改变量值
- ptype width 查看变量width的类型
- p width 打印width的值
还能使用set val命令来告诉GDB,来设置val的值。