以下内容主要参考自 100-gdb-tips (github),其在 Gitbook 上还有可读性更好的版本 100-gdb-tips (gitbook),但偶尔会访问不了
背景
本人平时主要写 C 语言,代码规模大起来后单纯靠 print 调试的话效率偏低,因此尝试用安装上手较为简单的 gdb
辅助调试,以下是个人觉得使用频率较高的 gdb
相关使用总结
使用环境:
- Ubuntu-22.04
- gdb 12.1
- gcc 11.4.0
配置
有两个文件,具体说明参见 gdb 手册
gdbearlyinit
也可以在 ~/.bashrc
中起别名 alias gdb='gdb -q'
,看个人需求
# 启动时不打印提示信息
# gdb -q
set startup-quietly on
gdbinit
相比 配置gdb init文件,删除了 C++
相关的设置
# 保存历史命令
set history filename ~/.gdb_history
set history save on
# 退出时不显示提示信息
set confirm off
# 打印数组的索引下标
set print array-indexes on
# 每行打印一个结构体成员
set print pretty on
# 输出信息多时不分页输出
set height 0
编译选项
一些特殊的调试需求得在 gcc
编译时对应设置
宏定义支持
缺省情况下不能通过 print <macro_name>
的方式打印宏定义的值,需要添加两个选项
-g3
/-ggdb3
后一个是避免使用 gdb 时提示无调试信息
-gdwarf-2
/-gdwarf-3
/-gdwarf-4
这一选项在 支持预处理器宏信息 中没有提及,但是不加就没效果,还是参考 12 C Preprocessor Macros 找到的
未使用的自定义类型
缺省情况下如果自定义的类型没有使用到,调试时使用 sizeof
会无法找到对应的符号信息
-fno-eliminate-unused-debug-types
命令
函数相关
断点
观察点可以视为更自动化的断点
until
/u
可视为断点 break
与继续 continue
的结合,可用来执行完循环内容等,就不赘述了
打印
其他
尾记
原链接中其实还有 C++
相关、多线程、汇编等调试相关内容,本人暂时涉及不到,就不记录了,感兴趣的读者可对照 100-gdb-tips (github) 查看