gdb调试笔记
最编程
2024-07-07 11:18:14
...
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
推荐阅读
-
深度生成模型文物修复--论文阅读笔记(指南-6)
-
ROS 理论与实践学习笔记 - 5 ROS 机器人系统模拟 URDF 集成 Gazebo
-
C++ 研发笔记 2 - 学习规划概述
-
C# - 刘铁萌笔记
-
学习笔记和每日一题 - 输入: nums = [7,8,9,11,12] 输出:1 解释: 最小的正数 1 没有出现:最小的正数 1 没有出现。 提示
-
JavaScript 第 16 章:错误处理和调试
-
使用 Gin 框架构建分布式应用程序》阅读笔记:第 52 页至第 76 页
-
Springboot017 学生读书笔记分享(论文+源代码)_kaic
-
IOS APP 初学者经验 - 第 1 课:如何在 Mac 中进行实际调试
-
[阅读笔记 - 解密超大规模集成电路设计方法] 问题 6:实现超大规模集成电路(VLSI)设计的主要方法是什么?