适合有入门GDB调试基础的开发者,0基础的同学建议查看其它资料
1、程序运行参数。
set args 可指定运行时参数。(如:set args -f 20 -t 40)
show args 命令可以查看设置好的运行参数。
2、运行环境。
path 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=user
show environment [varname] 查看环境变量。
==[设置观察点(WatchPoint)]=========================================
watch 一量表达式值有变化时,马上停住程序。
rwatch 当表达式(变量)expr被读时,停住程序。
awatch 当表达式(变量)的值被读或被写时,停住程序。
info watchpoints 列出当前所设置了的所有观察点。==[为停止点设定运行命令(很实用的强大的功能.)] =======================
commands [bnum]
... command-list ...
end
为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运
行命令列表中的命令。
==[调试子进程]=======================================================
方法一:
GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
set follow-fork-mode [parent|child]
* parent: fork之后继续调试父进程,子进程不受影响。
* child: fork之后调试子进程,父进程不受影响
(gdb) set follow-fork-mode child
(gdb) break 子进程行号
方法二:
使用GDB的attach命令.
attach命令可以绑定一个外部程序进行调试(可参考(gdb) help attach).
假设调试名为test_proc进程的子进程.先使用
$ ps -ef | grep test_proc
找出其子进程的PID号.然后
(gdb) attach <子进程的PID>
进行调试.之后,用detach命令终止调试.
可以把follow-fork-mode和attach混合使用,用来调试正在运行的程序的子进程.
----------------------------------------------分割线-----------------------------------------------------------------
GDB Layout命令
命令功能
layout src显示源码窗口
layout asm显示汇编窗口
layout split显示源码 & 汇编窗口
layout regs显示汇编 & 寄存器窗口
layout next下一个layout
layout prev上一个layout
C-x 1单窗口模式
C-x 2双窗口模式
C-x a回到传统模式
GDB 跳转执行命令
命令功能
start开始启动程序,并停在main第一句等待命令
观察点
当待观察点被读 或 被写时,程序停下来,并输出相关信息
命令功能
watch设置写观察点
rwatch设置读观察点
awatch设置读写观察点
info watchpoints查看观察点列表
Display跟踪点
display var每次停下来时,显示设置的变量var的值
undisplay取消跟踪显示
info display设置读写观察点
info watchpoints查看跟踪列表
忽略前面的某个断点
ignore 2 5 //忽略断点2 的前面 5 次,到第 6 次才停止
使用 examine 命令查看内存地址中的值。格式是x /<n/f/u> <addr>,其中<addr>是内存地址。
查看内存数据
在调试代码时,经常需要查看某块内存的数据,此时就需要使用GDB中的Examining memory。
可以使用命令x(即examine)来检查任意格式的内存数据,不管你的程序数据类型。使用的格式为:
x /nfu addr
x addr
其中n/f/u 是选项参数,指定内存的大小及显示格式;addr 指定显示的内存的起始地址。n 是十进制的整数,指定小时内存的大小;f 指定显示的格式,它的使用与 GDB 中的 print 使用的格式一样,如x指定使用 16 进制显示, d按十进制格式显示等;u 是指每个显示单元的大小,如b是指每个显示单元为 byte,h是指每个显示单元为半字(两个 byte)等;addr 指定要显示的内存的起始地址。
分割窗口
layout 用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个 layout
layout prev:显示上一个 layout
Ctrl+L:刷新窗口
Ctrl+x,再按1:单窗口模式,显示一个窗口
Ctrl+x,再按2:双窗口模式,显示两个窗口
Ctrl+x,再按a:回到传统模式,即退出 layout, 回到执行 layout 之前的调试窗口
查看寄存器
查看寄存器的值,很简单,可以使用如下命令:
info registers, 查看寄存器的情况,除了浮点寄存器。
info all-registers, 查看所有寄存器的情况,包括浮点寄存器。
info registers , 查看所指定的寄存器的情况。
同样可以使用 print 命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了,例如p $eip。
汇编调试
在做 ARM 汇编时,需要使用 GDB 对汇编语言进行单步调试,但很多时候,没办法直接通过stepi或nexti进入汇编函数内调试。使用了一个迂回的方法:
设置断点,在汇编函数名处先设置断点。 break 。
直接显示汇编代码,layout asm;显示寄存器值,layout regs。
单步执行汇编命令stepi和nexti。
(gdb) frame 1
当执行GDB的frame命令时,当前正在执行的函数的帧被编号为0,其父帧(即该函数的调用者的栈帧)被编号为1,父帧的父帧被编号为2,以此类推。GDB的up命令将你带到调用栈中的下一个父帧(例如,从帧0到帧1),down则引向相反方向。
显示整个栈:backtrace
4 启动文件的使用
在重新编译代码时,最好不要退出GDB。这样,你的断点和建立的其他各种动作都会保留。要是退出GDB,就不得不再次重复键入这些内存。
然而,在完成调试前可能需要退出GDB。如果你要离开一段时间,而且不能保持登录在计算机中,则需要退出GDB。为了不丢失它们,可以将断点和设置的其他命令放在一个GDB启动文件中,然后每次启动GDB时都会自动加载它们。
GDB的启动文件默认名为.gdbinit。
在调用GDB时可以指定启动文件。例如,
$ gdb -command=z x
表示要在可执行文件x上运行GDB,首先要从文件z中读取命令。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线----------------------------------------
更多资料:http://lazybing.github.io/blog/2016/04/01/how-to-use-gdb/
http://notes.maxwi.com/2016/03/19/gdb/
http://beej.us/guide/bggdb/#compiling
https://www.jianshu.com/p/7e15d826a633