GDB调试命令精华讲解

适合有入门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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值