编译时要加上-g参数
利用gdb对一个可执行文件进行调试的命令为:
gdb filename
这告诉gdb装入filename的可执行文件进行调试。
gdb常用命令
quit - 退出gdb,简写“q”
run - 执行当前被调试程序,简写“r”
kill - 终止正在调试的程序
step - 执行一行源代码而且进入函数内部,简写“s”
next - 执行一行源代码不进入函数内部,简写“n”
break - 设置断点
backtrace - 回溯跟踪,简写“bt”
frame n - 定位到发生错误的代码段,n为backtrace 命令输出结果中的行号
print - 打印表达式或变量的值,或打印内存中某个变量开始的一段连续区域的值,还可以用来对变量进行赋值
display - 设置自动显示的表达式或变量,当程序停住或在单步跟踪时,这些变量会自动显示其当前值
list - 列出产生执行文件的源代码的一部分
jump - 使程序跳转执行
使用方法
1.使用断点
dgb下的常用命令(break, list ,jump等)后面都可以跟不同的参数,使命令变得更加灵活。这些参数为:
- <linenum>-------------------行号
- <function>-------------------函数名
- <+offset>-------------------当前行号的正偏移量
- <-offset>--------------------当前行号的负偏移量
- <filename:linenum>--------某个文件的某一行
- <filename:function>--------某个文件的某个子函数
- <*address>-----------------程序运行时的语句在内存中的地址
- break <function>---------进入指定函数停住
- break <linenum>---------指定行号停住
- break +offset -------------在当前行号的前面offset停
- break -offset --------------在当前行号的后面offset停
- break filename:linennum-在源文件filename的linenum停
- break filename:function--在源文件filename的function函数入口停
- break *address------------在程序运行的内存地址停
2.查看运行时数据
2.1 print命令(简写p)
print的格式
print <expr>
print /<fmt> <expr>
<expr>是表达式,<fmt>是输出格式,如按十六进制输出,则是/x。
2.2 输出格式
- x - 十六进制
- d - 十进制
- u - 按十六进制显示无符号整型
- o - 八进制
- t - 二进制
- a - 十六进制
- c - 字符格式
- f - 浮点格式
2.3 自动显示命令display
格式
display <expr>
display /<fmt> <expr>
display /<fmt> <addr>
<expr>是表达式,<fmt>是输出格式,<addr>表示内存地址
设置好表达式(可以是变量)后,以后每一步都会显示设置好的表达式。
2.4 查看内存
使用examine命令(简写x),语法如下
x/<n/f/u> <addr>
参数说明如下:
- n,f,u是可选参数,可以独立使用,也可以联合使用。
- n是一个正整数,表示显示内存长度,即从当前地址向后显示n个地址的内容。
- f表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s;如果是指令地址,格式可以是i。
- u表示从当前地址向后请求的字节数,如果不指定的话,gdb默认是4byte。u的参数可以用下面字符代替:b表示单字节,h表示双字节,w表示4字节,g表示8字节。当指定字节长度后,gdb会从指定的内存地址开始,读写指定字节并把它当作一个值取出来。
- <addr>表示内存地址。
3 查看源代码
使用list
- list <function>---------显示名为function函数的源程序
- list <linenum>---------显示第linenum行周围的源程序
- list ----------------------显示当前行后面的源程序
- list - -------------------显示当前行前面的源程序,一般上5后5或上2后8,默认10行
- set listsize <count>----设置一次显示源代码的行数
- show listsize------------查看当前listsize的设置
- list <first>,<last>-----显示从first到last行之间的源程序
- list ,<last>-------------显示从当前行到last行之间的源程序
源代码的内存,使用info line+“行号”,“函数名”,“文件名:行号”,“文件名:函数名”等,可查看其在内存中的地址。
查看汇编代码,使用disassemble +“行号”,“函数名”,“文件名:行号”,“文件名:函数名”。
4.改变程序的执行
4.1修改变量值
使用print修改,如 print x = 9
4.2跳转执行
使用jump <linespec> 和 jump <address>
4.3强制函数返回
使用return 或 return <expression>
4.4强制调用函数
call <expr> 或 print <expr>