GDB 常用法

1. 帮助

选项 作用
help 列出所有命令分类
help class 列出分类class中的命令列表
help command 显示命令command的使用说明

2. 启动

选项 作用
gdb program 开始调试program
gdb -command=c program 开始调试progream,c是本项目的启动文件
gdb program core 调试program,core作为credump文件
  • 加载程序时,gdb尝试加载启动文件。有两个启动文件,一个是~/.gitinit,属于当前用户,另一个属于特定项目,用-command选项指定。
  • ~/.gitinit是在加载程序前加载的,适合一般用途;-command指定的启动文件是在加载程序后加载的,所以特定于项目,如设置断点等。

3. 运行程序

选项 作用
run arglist 设置参数列表为arglist,并运行程序
run 用当前的参数列表运行程序
set args [arglist] 设置参数列表为arglist。如果没指定arglist,则清空参数列表
show args 显示当前参数列表
run ... <inf >outf 输入、输出分别重定向到inf,outf
kill 杀死运行中的程序
set env var string 设置环境变量var的值为string
show env 列出所有环境变量
show env var 列出环境变量var的值
unset env var 删除环境变量var

4. 调试目标

选项 作用
target type targ 连接到指定类型typed的目标targ,如远程机器
attach process 挂接到指定进程
detach 脱离(放弃控制)当前进程

5. 工作文件

选项 作用
info sharedlib 列出当前加载的动态库

6. 符号表

选项 作用
info address s 显示符号s的地址
info func reg 显示函数reg的原型。regexpr是正则表达式
info var reg 显示全局变量reg的定义
whatis expr 显示expr的类型。expr可以是变量或类型
ptype expr 显示expr的类型。信息比whatis更详细

7. Shell命令

选项 作用
cd dir 工作目录改成dir
pwd 显示工作目录
make 调用make
shell cmd 运行Shell命令cmd

8. 断点 breakpoint、监视点 watchpoint

选项 作用
break [file:] line 在文件file、行line设置断点。b等同于break。
break [file:] function 在文件file、函数function设置断点
break ... if expr 设置条件断点,如果expr非0,则停止
cond n [expr] 给断点n设置条件,如果没指定expr,则清除条件。
commands n 给断点n设置命令列表。
tbreak ... 设置临时断点,一次有效
info break 显示所有断点
clear [file:] line 清除文件file、行line的断点。
clear [file:] function 清除文件file、函数function的断点
delete [n] 删除断点n。如果没指定n,清除所有断点。
disable [n] 禁用断点n。如果没指定n,禁用所有断点。
enable [n] 启用断点n。如果没指定n,启用所有断点。
watch expr 设置监视点,如果expr变化,则停止
info watch 显示所有监视点
  • 断点、监视点列表
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040087b in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:24
2       hw watchpoint  keep y                      xyz

Num: 编号
Type: 类型。可以是breakpoint、watchpoint、或catchpoint。
Disp: 部署Disposition,指出gdb下次暂停时怎样处理该断点。可以是keep(保持),del(删除) 或dis(禁用)。
Enb: 当前,可以是y(启用)或n(禁用)。
Address: breakpoint在内存中的位置。watchpoint这项为空。
What: breakpoint在源代码中的位置。watchpoint这项是变量或表达式名。

  • 如下是设置条件断点的一个例子:
(gdb) break 21 if x == 0
(gdb) info break
7       breakpoint     keep y   0x00000000004007f6 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:21
    stop only if x == 0
(gdb) cond 7  x < 3
  • 条件断点的 if 部分可以包含自定义函数:
break 21 if test_var(x)

也可以包含库函数,如:

break 21 if strlen(mystring) > 1
  • 给断点设置命令列表的一个例子如下:
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>silent
>printf "x is %d.\n", x
>end
(gdb) info b
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000004008c9 in main(int, char**) at /home/ron/dev/cmake/demo/main.cpp:33
    breakpoint already hit 2 times
        silent
        printf "x is %d.\n", x
  • 监视点结合了断点和变量检查的概念。基本的形式是: 当变量值发生变化时,暂停程序执行。
(gdb) watch z

更好的方法是指定条件表达式。如下的形式是:当z的值第一次大于28时,暂停执行。

(gdb) watch (z>28)
  • 监视点指定的变量要处于作用域内。一旦离开作用域,监视点被删除。

9. 浏览栈帧

选项 作用
backtrace 显示栈的所有帧。bt等同于backtrace。
frame n 设置帧n为当前帧
up 设置父帧为当前帧
down 设置子帧为当前帧
frame 显示当前帧
info frame 显示当前帧的局部变量、形参等信息
info args 显示当前帧的参数
info locals 显示当前帧的本地变量
info reg 显示当前帧的寄存器
  • 栈帧(stack frame)中保存与函数调用关联的运行时信息。每个帧保存该层函数的局部变量、形参、调用函数的位置等。正在执行的函数帧编号为0,其父帧编号依次为1,以此类推。

10. 执行控制

选项 作用
continue 继续执行。 c等同与continue
next 单步执行,跳过函数调用。n等同与next
step 单步执行,进入函数调用。s等同与step
until [location] 执行到 location 指定的位置
finish 执行到当前帧返回
signal sig 向进程发送信号signal并继续执行
  • 如果没有指定location, until 运行到下一个指令(内存地址比当前地址高)。

  • signal的参数sig可以是signal名字,如:

(gdb) signal SIGINT

也可以是数字,如:

(gdb) signal 2

11. 显示变量

选项 作用
set var = expr 变量var赋值为expr
print [/f] expr 按照 /f 指定的格式显示expr
x [/Nuf] addr 按 /Nuf 指定的格式显示地址addr处的数据
display [/f] expr 每次停止执行时,自动显示expr的值
undisplay n 删除display变量
info display 列出所有display变量
printf 类似C函数printf()的用法
disassem [addr] 显示汇编代码
  • print /f expr 中的 f 可以是如下值之一:
x 十六进制
d 有符号十进制
u 无符号十进制
a 地址
c 字符
f 浮点数
s NULL结尾的字符串
  • x [/Nuf] expr 中, Nuf依次指定多个单元 (N)、单元大小(u)、和单位类型(f)。
    • u可以是如下值之一:
b byte,1个字节
h halfword,2个字节 
w words,4个字节
g giant word,8个字节
  • 使用printf的一个例子如下:
(gdb) printf "x is %d.\n", x 

printf 一般用于编写断点命令、宏这些扩展功能。

12. 浏览源代码

选项 作用
list 从当前位置开始,列出后面10行源代码
list line 列出行line 前后的源代码,line可以是[file:]num、[file:]function
list - 从当前位置开始,列出前面10行源代码
list f,l 列出从 f 行到 l 行的源代码
list file:line 列出指定文件的line行。这个命令会切换当前源文件
info sources 显示正在使用的源文件名列表
info source 显示当前源文件名

13. 多线程

选项 作用
info threads 列出所有线程
thread n 切换到指定的线程,n是线程编号
set scheduler-locking on 只运行当前线程,锁住其他线程
set scheduler-locking on step 单步执行当前线程时,锁住其他线程
set scheduler-locking off 运行当前线程,同时运行其他线程
handle SIG32 nostop 让程序接收到sig32信号时,不挂起

相关链接

GDB 常用法
GDB 调试Coredump问题
嵌入式开发中GDB调试Coredump问题
嵌入式开发中GDB串口远程调试
用backtrace()调试coredump问题
Valgrind memcheck 用法
Address Sanitizer 用法
Program received signal SIG32, Real-time event 32
SIG32 和 SIG33

参考资料

GDB Quick Reference
http://www.scott-webb.co.uk/misc/refcard.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容