gdb调试命令解析


1. 被调试的程序需要带调试信息

gcc -g -o hello_server hello_server.c

2. 启动gdb调试的方法

# 直接调试
1. gdb filename
# 当程序启动了,但又需要调试时
2. gdb attach pid
# 当程序崩溃时,可利用core文件定位崩溃原因
4. gdb filename corename

2.5 gdb常用命令详解——利用gdb调试redis | CppGuide社区

1. gdb常用调试命令概览和说明

命令名称命令缩写命令说明
runr运行一个程序
continuec让暂停的程序继续运行
breakb添加断点
tbreaktb添加临时断点
backtracebt查看当前线程的调用堆栈
framef切换到当前调用线程的指定堆栈
infoinfo查看断点 / 线程等信息
enableenable启用某个断点
disabledisable禁用某个断点
deletedel删除断点
listl显示源码
printp打印或修改变量或寄存器值
ptypeptype查看变量类型
threadthread切换到指定线程
nextn运行到下一行
steps如果有调用函数,进入调用的函数内部,相当于 step into
untilu运行到指定行停下来
finishfi结束当前调用函数,到上一层函数调用处
returnreturn结束当前调用函数并返回指定值,到上一层函数调用处
jumpj将当前程序执行流跳转到指定行或地址
disassembledis查看汇编代码
set args设置程序启动命令行参数
show args查看设置的命令行参数
watchwatch监视某一个变量或内存地址的值是否发生变化
displaydisplay监视的变量或者内存地址,当程序中断后自动输出监控的变量或内存地址
dirdir重定向源码文件的位置
1. run
(gdb) run

# ctrl + c 中断程序
2. continue
(gdb) continue

# 遇到断点继续程序
3. break
## 在函数名为functionname的入口处添加一个断点 
(gdb) break functionname                 
## 在当前文件行号为LineNo处添加一个断点
(gdb) break LineNo                            
## 在filename文件行号为LineNo处添加一个断点
(gdb) break filename:LineNo            

4. tbreak
(gdb) tbreak
#  添加临时断点
5. backtrace & frame
(gdb) bt
# 到达断点处,查看当前所在线程的调用堆栈

(gdb) frame 堆栈编号(编号不用加#)

# 切换到其他堆栈处
6. info break & disable & enable
(gdb) info b
# 查看所有断点情况

(gdb) disable 断点编号
# 禁用断点,不加编号禁用所有断点

(gdb) enable 断点编号
# 启用断点,同理
7. list
(gdb) l
# **list**命令用于查看当前断点附近的代码
(gdb) l +
# 查看后十行
(gdb) l -
# 查看前十行
8. print & ptype
# **print**命令可以在我们调试过程中方便地查看变量的值,也可以修改当前内存中的变量值

(gdb) p server.port=6400
$4 = 6400
(gdb) p server.port
$5 = 6400

(gdb) print /format variable
# 指定输出格式

o octal 八进制显示
x hex 十六进制显示
d decimal 十进制显示
u unsigned decimal 无符号十进制显示
t binary 二进制显示
f float 浮点值显示
a address 内存地址格式显示(与十六进制相似)
i instruction 指令格式显示
s string 字符串形式显示
z hex, zero padded on the left 十六进制左侧补0显示

(gdb) ptype 变量
# 输出变量类型
9. info & thread
(gdb) info threads
# 查看所有线程情况,使用bt可查看当前调用堆栈

# **线程编号前面的星号**表示的是**gdb当前作用于哪个线程**

(gdb) thread 线程编号
# 切换线程
10. next & step & until & finish & return & jump
(gdb) n
# 根据程序逻辑跳转到相应的位置,接下来可直接回车实现“单步步过”

(gdb) step
# 遇到函数调用,进入函数内部,“单步步入”

(gdb) return
# 退出步入的函数,即返回上一层

(gdb) finish
# 结束函数

(gdb) until 行号
# 让程序运行到指定行停下来

(gdb) jump <location>
11. disassemble
(gdb) diassemble
# 输出当前函数的汇编指令
12. set args & show args
(gdb) set args ../redis.conf 
(gdb) show args
Argument list to give program being debugged when it is started is "../redis.conf ".
(gdb) 

(gdb) set args "999 xx" "hu jj"
(gdb) show args
Argument list to give program being debugged when it is started is ""999 xx" "hu jj"".
(gdb) 
# 如果单个命令行参数之间含有空格,可以使用引号将参数包裹起来。

13. watch

watch是一个强大的命令,它可以用来监视一个变量或者一段内存,当这个变量或者该内存处的值发送变化时,gdb就会中断下来。

int i;  
(gdb) watch i

char *p; 
(gdb) watch p 与 watch *p

char buf[128];
(gdb) watch buf

14. dispaly
(gdb) display 变量名/内存地址/寄存器名

(gdb) delete display 
15. dir
# 加一个源文件路径到当前路径的前面,指定多个路径,可以使用”:”
(gdb) dir SourcePath1:SourcePath2:SourcePath3


参考链接:
2.6 使用gdb调试多线程程序 | CppGuide社区
https://github.com/0voice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值