GDB调试

前言

在项目开发的过程中,除了编写代码,还需要对程序进行调试和问题修复,一遍就过的事情是不存在的,编码5分钟,调试2小时才是常规操作。这时候,一个好的调试方法可以让你迅速定位bug的能力大放光彩。C/C++开发我推荐使用 “printf()” 定位问题,大道至简,顶尖的 coder 往往使用最朴素的方式分析问题, “printf()” 进可遍历参数实时掌控变量的变化,退可追踪接口时刻紧跟程序的走向,此乃 真.杀人利器 。然而天道残缺, “printf()” 也不是全能的,在多线程和内存管理的方面存在一点点小问题,所以我们有时候也需要一个小工具(GDB)来辅助排查问题。下面举栗子说明 “GDB” 的一些常用操作。

启动

启动调试程序 app ,传入参数1 “24” 和参数2 “56”,设置动态库检索路径环境 “/home/lk/test

1) 使用 gdb 启动程序
$ gdb app
2) gdb 中传入程序启动的参数
(gdb) set args 24 56
3) 查看参数列表
(gdb) show args
4) 设置环境
(gdb) set environment LD_LIBRARY_PATH=/home/lk/test:${LD_LIBRARY_PATH}
5) 查看环境
(gdb) show environment LD_LIBRARY_PATH

断点

可以使用行号、文件名、函数名等元素自由组合设置断点。

1) 查看已设置的断点
(gdb) info breakpoints
2) 在第 100 行设置断点
(gdb) break 100 
3) 在 test.c 的第 100 行设置断点
(gdb) break test.c:100 
4) 调用 open 函数的位置设置断点
(gdb) break open
5) 指定 test.c 文件的 open 函数
(gdb) break test.c:open
6) 根据条件设置断点,如:执行 test.c 的第 100 行的代码时,如果 a 等于 0,打断程序运行
(gdb) break test.c:100 if a==0
7) 禁用断点号为 1 的断点,启用则把 disable 改为 enable。断点号可以使用 info breakpoints 查看
(gdb) disable 1
8) 禁用所有断点,启用则把 disable 改为 enable
(gdb) disable
9) 删除断点号为 1 的断点
(gdb) delete 1
10) 删除所有断点
(gdb) delete

调试

调试主要是通过单步调试查看分支、查看堆栈信息、打印变量等手段排查程序的异常。

1) 运行调试程序,设置好参数、环境、断点之后,开始调试
(gdb) run
2) 打印变量 a 的值
(gdb) print a
3) 打印 test.c 文件变量 a 的值
(gdb) print 'test.c'::a
4) 打印 open 函数变量 a 的值
(gdb) print 'open'::a
5) 查看所有全局变量和静态变量
(gdb) info variables
6) 查看当前堆栈所有局部变量
(gdb) info locals
7) 查看当前堆栈所有参数
(gdb) info args
8) 查看堆栈信息(程序崩了查这个)
(gdb) backtrace
9) 查看当前行前面的十行源码(需要编译时加上参数 -g 把源码信息编译到执行文件)
(gdb) list -
10) 查看当前行后面的源码
(gdb) list
11) 查看 open 函数的源码
(gdb) list open
12) 查看 test.c 文件第 100 行的源码
(gdb) list test.c:100
13) 单步调试,程序在断点停止时,执行下一条语句
(gdb) next
14) 单步进入,程序在断点停止时,进入调用的函数内部(需要源码信息)
(gdb) step
15) 继续运行到下一个断点
(gdb) continue
16) 运行到第 105 行时停住(在一个断点,临时想继续运行一段代码时使用)
(gdb) until 105

总结

GDB 常用的调试方式大概就上面列出的这些了,老实说确实挺麻烦的,还是用 printf() 吧,简单粗暴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值