gdb

gdb参数解释

-help     #帮助
-version  #版本号
--args    #指定运行参数比如gdb --args a.out 1 2 3
-q        #不显示启动信息

-s        #指定符号表文件
-e        #指定可执行文件
-c        #指定core dump文件
-p        #绑定到特定进程
-x        #指定执行命令文件
-d  #增加搜索路径
-r  #立马加载所有符号表,启动变慢
-n  #不执行初始化文件里的命令,比如.gdbinit
-nw #不执行home目录的.gdbinit
-batch  #批处理

-nw  #无窗口命令行模式
-w   #尽量使用窗口模式
-cd  #指定工作目录运行
-D   #指定数据目录
-t   #指定tty用来输入输出
-tui #文本界面模式,源码 汇编 寄存器

-statistics  #显示时间内存使用

显示帮助

h后面带上具体需要帮助的项目,比如 h data

h
help

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

额外重要指令

file xxx  #指定调试的二进制
#同时指定 core dump 文件
gdb program core
#通过进程id调试特定的进程,gdb会先查找 core 文件
gdb program pid
r    #运行程序
c    #continue
s/step    #进入函数
n/next [count]    #next 单步调试
finish       #直到函数返回
u/until      #一般用来跳过重复循环
u location   #运行到特定位置停止
advance location  #同上,但是不会跳过递归函数

l/list first,last  #显示源码

si   #指令跳入
ni   #指令下一步,如果是函数,直到函数返回

show
info
complete xx  #命令补全

#禁用随机地址
set disable-randomization on
set args  #设置运行参数

#环境变量
show paths
show environment [varname]
set environment varname [=value]
unset environment varname

#工作目录
set cwd [dir]
show cwd
cd [dir]
pwd

#输出重定向
tty /dev/pts/1
set inferior-tty [ tty ]
show inferior-tty

#绑定到特定进程
attach pid
detach
kill  #杀死特定子进程

记录日志

set logging on  #默认记录输出到gdb.txt
set loggin off
show logging

调试多进程多线程

#查看进程
info inferiors
inferior <infer number>

detach inferior infno...
kill inferiors infno...

#开启inferiors开始或终止事件通知
set print inferior-events on

#查看线程
info thread

#切换线程
thread thread_no

#特定线程断点
b <line> thread <threadno>


follow-fork-mode  detach-on-fork   #说明
parent                   on      #只调试主进程(GDB默认)
child                    on      #只调试子进程
parent                   off     #同时调试两个进程,gdb跟主进程,子进程block在fork位置
child                    off     #同时调试两个进程,gdb跟子进程,主进程block在fork位置

set follow-fork-mode [parent|child]   set detach-on-fork [on|off]

#new same
set follow-exec-mode mode

设置快照

很多时候当要接近问题时,各种调试,我们可以新建快照,免得每次重新启动

好处:linux为了安全,虚拟地址每次启动都是随机的,通过快照无需重新启动程序,虚拟地址也不会变

checkpoint
info checkpoints
restart checkpoint-id
delete checkpoint checkpoint-id

打断点

#打断点
b 222
b func
b file:222
b file:func

b func if a == 10

#强制打断点
break func -force-condition if cond

#临时断点,遇到一次后自动删除
tb func

#正则断点
rb regex
rb file:regex

#查看断点
info b

#目前如果不存在,开启未来自动打断点
set breakpoint pending on

#清除断点
clear
clear func
clear file:func

#删除所有断点
d

#启用禁用断点
enable [breakpoints]
disable [breakpoints]

save breakpoints [filename]

动态打印结果

到达此断点,默认一般会调用printf函数打印

dprintf 25,"at line 25,age:%d",age

#也可以手动指定
set dprintf-style call
set dprintf-function fprintf

#指定fprintf函数的第一个参数
set dprintf-channel mylog

设置监控点

watch foo

#监控该指针指向的4个字节
watch *(int *) 0x600850

rwatch   #监控读
awatch   #监控读或者写
info watchpoints

设置事件捕获

catch throw [regexp]
catch catch [regexp]
catch exception [name]
catch handlers [name]
catch assert
catch exec

#所有系统调用
catch syscall

#特定系统调用
catch [name | number]

catch fork
catch vfork
catch load [regexp]
catch unload [regexp]
catch signal[signal...|'all']

#一次后删除
tcatch event

函数调用栈

bt [n]

#显示frame
info frame

打印

#打印len个数组值
p *array@len

p /x
p /z  #同上,但是会前补0
p /d
p /u
p /o  #八进制
p /t  #二进制
p /a  #地址
p /c  #字符
p /f  #浮点
p /s  #当做字符串

打印设置

set print address on   #开启打印地址
set print array on     #格式化打印数组
set print array-indexes on  #打印数组带上索引

#重复次数
set print repeats number-of-repeats
set print repeats unlimited

#深度
set print max-depth depth
set print max-depth unlimited

#遇到空字符停止
set print null-stop

#格式化打印结构体
set print pretty on

寄存器

info registers

p /x $pc
p /x $sp
p /x $fp
p /x $ps  #处理器状态

set $sp += 4

生成core dump文件

一般默认为core.xxxx

gcore [file]

#是否参考 /proc/pid/coredump_filter 文件里面的格式
set use-coredump-filter on
set use-coredump-filter off

搜索内存

find buf,+1024, "hello"
find buf,+1024, 'h','e','l','l','o','\0'

find start_addr, +len, val1 [, val2, ...]
find start_addr, end_addr, val1 [, val2, ...]

宏定义展开

#define M 42
#define ADD(x) (M + x)
(gdb) info macro ADD
Defined at /root/ccc/main.c:5
#define ADD(x) (M + x)

(gdb) macro expand ADD(1)
expands to: (42 + 1)

改变执行

#改变变量
set var age=33

#给自己发信号
signal [SIGINT/num]

#函数直接返回特定的值
return expression

#调用函数
p add(1,2)
call add(1,2)

#可读可写打开
set write on

设置大小端

set endian big
set endian little

显示进程信息

info proc
info proc all
info proc mappings

文本用户界面

layout next    #下一个layout
layout prev    #上一个layout
layout src     #源码窗口
layout asm     #汇编
layout split   #汇编和源码多窗口
layout regs    #显示寄存器

focus next
focus prev
focus src
focus asm
focus regs
focus cmd

#刷新窗口
refresh
ctrl+L

设置窗口大小

具体 help winheight,可以修改src cmd asm regs 窗口大小

#单位为行
winheight src +10
winheight cmd -5


上一篇: Makefile
下一篇: gcc
作者邮箱: 203328517@qq.com