gdb调试器

编译时要加上-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>

原文地址:https://www.cnblogs.com/ivorfeng/p/3059594.html