如果不熟悉 Linux 命令行操作,那么 gdb 对你来说可能有点难,建议先学 Linux 命令行的基本操作,推荐《鸟哥的Linux私房菜基础篇》和《Linux就是这个范儿》这两本书。
鸟哥的Linux私房菜基础篇
链接: https://pan.baidu.com/s/15tyHgfL417OY119D4KBdHg 提取码: e8pc
Linux就是这个范儿
链接: https://pan.baidu.com/s/1HsX08i4QXsl_yy_HvoKqJQ 提取码: 9w73
等你熟悉了 Linux 命令行之后,学习 gdb 就容易一点了,但是还是要多练,常用的 gdb 命令并不多,但是也需要一些调试和操作系统的基础知识,如断点、调用堆栈、线程等概念,如果你已经了解了这些基础概念之后,学习 gdb 就不难了,只要你肯练习,十分钟内足可掌握,但是要灵活使用 gdb 调试还是需要多加练习,建议用 gdb 去调试一些工业级的开源项目,例如 Nginx、Redis 这样的源码。
我写过一篇如何使用 gdb 调试 Nginx 的源码,建议在你熟悉 gdb 调试之后再回过头来看这篇文章:
常用的 gdb 命令并不多,我这里总结了一个表:
命令名称 | 命令缩写 | 命令说明 |
---|---|---|
run | r | 运行一个程序 |
continue | c | 让暂停的程序继续运行 |
break | b | 添加断点 |
tbreak | tb | 添加临时断点 |
backtrace | bt | 查看当前线程的调用堆栈 |
frame | f | 切换到当前调用线程的指定堆栈 |
info | info | 查看断点/线程等信息 |
enable | enable | 启用某个断点 |
disable | disable | 禁用某个断点 |
delete | del | 删除断点 |
list | l | 显示源码 |
| p | 打印或修改变量或寄存器值 |
ptype | ptype | 查看变量类型 |
thread | thread | 切换到指定线程 |
next | n | 运行到下一行 |
step | s | 如果有调用函数,进入调用的函数内部,相当于step into |
until | u | 运行到指定行停下来 |
finish | fi | 结束当前调用函数,到上一层函数调用处 |
return | return | 结束当前调用函数并返回指定值,到上一层函数调用处 |
jump | j | 将当前程序执行流跳转到指定行或地址 |
disassemble | dis | 查看汇编代码 |
set args | 设置程序启动命令行参数 | |
show args | 查看设置的命令行参数 | |
watch | watch | 监视某一个变量或内存地址的值是否发生变化 |
display | display | 监视的变量或者内存地址,当程序中断后自动输出监控的变量或内存地址 |
dir | dir | 重定向源码文件的位置 |
网上很多关于 gdb 的教程都是零散的,不成体系,且调试的都是各种玩具型程序,看完后很多读者还是不知道如何调试大型 C/C++ 项目,因此我结合自己的工作经验,写了一套《gdb 高级调试实战教程》,这个教程有如下特点:
-
以调试开源项目 Redis-Server 为例,项目不是玩具型的,具有实战意义;
-
按调试流程,从 gdb 附加调试程序,到启动 gdb 调试再到使用 gdb 中断 Redis 查看各种状态,循序渐进地介绍各种 gdb 调试命令;
-
介绍了实际工作中 gdb 的各种高级调试技巧,例如如何显示超长字符串、如何使用 gdb 调试多进程程序等等;
-
也介绍了基于 gdb 的一些高级工具,如 cgdb、VisualGDB,这些章节是为不习惯 gdb 显示源码方式的同学量身定制。
以下是电子书目录:
《gdb 高级调试实战教程》电子书下载链接:
链接: https://pan.baidu.com/s/1OPBKhApfLcrkSvf8jva6NQ 提取码: cusc
相关的配套资源:
-
Redis 6.0.6 源码下载:GitHub - balloonwj/redis-6.0.3: redis6.0.3,源码来源于官网,官网这个版本下载链接已经失效。
-
cgdb 下载地址:cgdb
-
VisualGDB 破解版下载地址:
链接: https://pan.baidu.com/s/1IcMOf5bQLoSwYLDn_SbRjg 提取码: uuau
总而言之,熟练掌握 gdb 调试等于拥有了学习优秀 C/C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。
一些可能对你有用的资源:
一些有用的资源: