1、基础调试
不过多赘述gdb相关概念,如下为实际用法及示例
如图进入项目工程
键入 gdb cli_main进入调试界面
键入start程序开始运行
下面列出gdb基础指令说明
如下我键入n(next缩写)进行单步运行,并用p打印结构体变量addr的值
上述表格还有诸多命令,如遇相关场景使用即可,掌握以上便可初步调试较小功能模块程序
2、进阶调试
如果想在程序运行过程中不断查看某个变量的值,也可用dispaly 变量名,让其每次运行都自动打印该变量的值。如下图
想取消跟踪变量自动显示时,键入如下指令,其中1是这个变量的编号
对于大工程,代码较长时需要设置断点,b(break) 行数即在该行设置断点,info breakpoints,查看你设置的所有断点信息。
有设置断点,必然也有删除,如下 delete breakpoints 3(还有使能和禁止某个断点,觉得不好故放弃用这种方式)
设置完断点后,用c(continue)让程序从当前位置一直运行知道遇到断点或结束,如图程序停在设置的35行断点处,若每次需从头开始可用run。
接下来比较有用的条件断点的使用方法
如上图所示,其中break...if...即为设置条件断点,如下为示例用法
(gdb) b 9 if s!=0 #增加条件断点 仅当s不等于0才中断
还有watch 和 x
watch的用法如下
(gdb) watch sum>20 #设置观察点表达式 sum>20 当 sum>20时会中断程序运行
x的用法如下
(gdb) x/40b arr # x
例如:int arr[10],x命令打印指定存储单元的内容,例如打印arr数组元素,使用x/40b arr ,这里 40b是打印格式,b表示每个字节一组,40表示打印40组,因为整数的sizeof是4,10个元素就是40组。
0x7fffffffe430: 1 0 0 0 2 0 0 0
0x7fffffffe438: 3 0 0 0 4 0 0 0
0x7fffffffe440: 5 0 0 0 0 0 0 0
0x7fffffffe448: 0 5 64 0 0 0 0 0
0x7fffffffe450: 64 -27 -1 -1 -1 127 0 0