gdb调试笔记

1. 开启

gdb

2. 退出

quit [expression]
C-d

3. 在gdb里面执行shell

shell cmd string
shell make make-args

4. 调用GDB

gdb program

5. 指定core文件

gdb program core

6. 调试运行中的文件

gdb program <pid>

7. 宁静模式

gdb -silent

8. 帮助

gdb -help

9.选择文件

-symbols file
-s file
# 符号文件
-exec file
-e file
# 执行文件
-core file
-c file
#core dump文件
-command file
-x file
#执行gdb命令的文件
-directory directory
-d directory
#搜索源文件的文件夹

10. 选择模式

-nx
-n
# 不执行在初始化文件的命令
# .gdbinit 、gdb.ini
-quiet
-silent
-q
# 不打印介绍和版权信息
-windows
-w
# 命令模式,无gui
-cd directory
# 进入文件夹作为工作目录

11. 调试进行中的进程

attach <process-id>

attach后进程会停住,若要它继续运行。则需要使用continue.

停止附着: detach

12. 标识源文件文件夹

directory dirname
dir dirname 
# 不同文件间使用:或者空格分隔
directory
#置源文件夹空
show direcotories
#打印源文件

13. 标识文件的命令

file filename 
#标识debug的文件
file
# 丢弃执行文件和符号文件
exec-file [filename]
执行文件
core-file [filename]
#生成core文件
info files
info target
#打印当前的调试目标,包括执行文件和符号文件

14. 可选的警告和信息

gdb默认是宁静的

set verbose on
set verbose off
show verbose
# 详细信息
set confirm off
set confirm on
show confirm
# 是否确认

15. gdb命令

RET
# 什么都不输入回车会重复上一个命令
info bre TAB
# 使用TAB补全

16. 屏幕大小

set height lpp
show height
set width cpl
show width

17. 获取帮助

help
# 获取帮助
# 获取帮助的类
# data
# running
# status

help class
# 具体的类

help command
# 具体某个命令

apropos args
# 搜索命令

complete args
# 补全命令

18. gdb下运行程序

-g -O
# 生成编译信息
run
r
# 运行程序
set args
show args
# 设置程序参数
path directory
#加入文件夹到path变量
show paths

show environment [varname]
#打印环境变量的值
cd directory
#切换工作区文件
pwd
#当前文件
info terminal
#当前使用的终端
run > outlife
#重定向终端输出
kill
# 生成core-dump文件

19. 多线程调试

thread [thread-number]
# 切线程
info threads
# 查询存在的线程
thread apply [thread-no] [all] args
# 对线程进行发送命令

break [line-no] thread [thread-no] 
#线程设置断点
break [line-no] thread
[thread-no]
#线程设置条件断点

20 设置观察点

检测某个值的变化

watch [expr]
# 对表达式设置断点
rwatch [expr]
# 当表达式被程序读取时可以使用
awatch [expr]
# 当表达式被程序读写的时候
# 读写观察点需要硬件支持才行
info watchpoints
# 观察点信息

#只能看到单线程下的变化

21 多进程调试

绝大多数系统不支持多进程调试,
一种解决办法是,子进程中的代码
sleep,然后获取子进程的pid,最后再attach上去。

在某些系统上可以调试

set follow-fork-mode [mode]
#设置跟踪父进程还是子进程
# parent
# child
# ask
show follow-fork-mode
显示当前跟踪的是

22 设置捕捉点

设置捕获点当某个事件发生的时候。

catch [event]
# 捕获事件类型
# 事件类型包括
# throw C++抛异常
# catch C++捕获异常
# exec exec call
# fork fork call
# vfork vfork call
# load 动态库加载
# unload 

tcatch [event]
# 只用一次的捕捉点
info break
# 显示捕捉点

在捕获异常停下来
__raise_exception(void **addr, void *id);打断点
使用id的条件断点可以获取异常的类型。

23 设置断点

break [function]
break [linenum]
break [filename]:[function]
break [filename]:[linenum]

tbreak 
# 一次性断点1
info breakpoints
#查看所有断点

maint info breakpoints
#查看gdb维护的所有断点

24 删除断点

clear
#删除所有断点
clear [function]
clear [filename]:[function]
#删除函数内的断点
clear [linenum]
clear [filename]:[linenum]
#删除指定行断点
delete [breakpoints] [range..]
#删除指定断点号

25 禁用断点

enable [breakpoints] [range]
disable [breakpoints] [range]

26. 条件断点

condition [bnum] [expression]
# 在断点处设置条件
condition [bnum]
# 清楚条件处的断点

ignore [bnum] count
# 在触发count次后忽略掉该断点

27. 断点命令列表

可以给指定断点设置命令当触发的时候。

commands [bnum]
... command-list ...
end

比如x>0的时候打印断点的值

break foo if x>0
commands
silent
printf "x is %d\n",x
coutinue
end

在断点触发时设置正确的值

break 403
commands
silent
set x= y +4
cont
end

28. 断点菜单

C++里面可能有多个重载函数,
gdb提供了菜单进行选择想要设置断点的函数。

(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6

29. 续进和步进

continue [ignore-count]
c  [ign-cnt]
fg [ign-cnt]
# 从当前位置持续运行到断点
step [cnt]
#执行k步
next [cnt]
#下cnt步
finish
# 完成函数任务
until
u
#跳出循环的下一条指令
until [location]
#跳出当前栈帧或到下一个指定位置
stepi arg
stepi
si
#执行k步
nexti
nexti arg
ni
# 续进k步

30 信号处理

info signals
info handle
# 打印信号表
handle [signal] [keywords]
# 改变gdb处理信号的方式
# stop nostop
# print noprint
# pass ignore

31. 栈帧

frame args
#切换栈帧
select-frame
# silent 切换栈帧
bt
backtrace
where
info statck
# 查看整个栈
bt n
# 查看内层n个栈帧
bt -n
# 查看外层栈帧
up [n]
#栈帧上移
down [n]
#栈帧下移
info frame
# 栈帧信息
info locals
# 栈帧上的局部变量
info catch
# 栈帧上捕捉点
info args
# 栈帧的参数

32. 查看源文件

list [linenum]
list [function]
list 
list +
list -
#列出上一行
set listsize [cnt]
# 列出列出文件的大小
show listsize
# 显示打印的行数

forward-search [regexp]
search regexp
# 搜索文件
reverse-search regexp
# 反向搜索

33. 查看源文件的汇编结果

info line [linenum]
# 获取行对应的地址
disassemble [addr1] [addr2]
# 进行汇编翻译

34. 查看数据

print [expr]
# 打印数据

@
# 数组
::
# 文件或者函数
{type} [addr]
# 将地址的内容转成类型
p/x (short[2])0x12345678
#以16进制打印地址处的两个short变量

#打印格式
# x 16进制
# d 有符号
# u 无符号
# o 8进制
# t 2进制
# a 用地址打印
# c 字符串
# f 浮点数

35. 查看内存

x/nfu [addr]
x addr
x
查看内存
n
# 查看的数
f
#格式 s i x
u
# 集合大小
# b bytes
# h two bytes
# w word
# g eight bytes


x/3uh 0x54320

36. 自动显示

display [expr]
display/fmt [expr]
display/fmt [addr]

delete display [dnums]
enable display [dnums]
disable display [dnums]
display
info display

37. 便捷变量

以$开头

show convinience
# 打印便捷变量
set $i = 0
print bar[$i++]->contents
#设置便捷变量

$_
# x命令最后查看的地址
$__
# x命令最后查看地址
$_exitcide
# 退出值

38. 寄存器的值

info registers
info all-registers

info registers [regname] ...
# 查看寄存器

p/x $pc
x/i $pc 

Ref

Debugging_with_gdb

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值