使用gdb调试程序
1. 使用gdb调试程序
1.1 编译源代码
1.2 如何进入,退出gdb
1.3 浏览源代码
1.3.1 list命令
1.3.2 如何在gdb查找字符串
1.4 break point断点
1.4.1 设置断点
1.4.2 删除断点
1.4.3 查看断点信息
1.5 watch point监视点
1.5.1 设置监视点
1.5.2 查看监视变量的内容
1.6 catchpoints
1.7 让程序运行起来
1.8 查看变量
2. clewn
2.1 安装
2.2 简单使用
3. ddd
3.1 安装
3.2 使用
4. 相关文件下载及参考资料
<1>. 使用gdb调试程序
1.1 编译源代码
为了使用gdb调试程序的话,需要在使用gcc编译源代码时使用-g的选项,这样才能在编译完的二进制文件中包含调试信息。
xuqiang@ubuntu:~/gdb$ gcc debug.c -g -o debug
1.2 如何开始gdb调试程序和退出gdb程序
编译完成源文件之后,如果生成了二进制文件(上面的例子是debug),此时在debug文件的目录下键入gdb debug进入gdb调试:
xuqiang@ubuntu:~/gdb$ gdb debug
如果想要退出gdb,此时键入quit命令即可:
(gdb) quit
1.3 浏览源代码
现在我们已经能够进入到gdb环境中,我们想要设置断点开始调试,那如果不能够知道在哪里设置断点,就需要“浏览源代码”,找到需要设置断点的位置,然后设置断点。可以使用gdb的list命令或者是通过查找字符串的形式找到需要设置断点的行。
1.3.1 list命令
list命令后可接linenum或者是function-name,同时可以设置list命令每次默认显示的行数。
(gdb) list # 从上次显示行结束位置开始再次显示listsize行
(gdb) list 10 # 显示第10行附近的内容
(gdb) show listsize # 显示默认list命令显示的行数
(gdb) show listsize # 设置默认list命令显示的行数
1.3.2 如何在gdb查找字符串
在gdb中可以使用search命令查找字符串,并显示所有符合条件的代码,这里可以使用正则表达式。
(gdb) search main
1.4 断点
1.4.1 设置断点
(gdb) break main # 在main函数开始运行时,停止
(gdb) break 26 # 在line 26行设置断点
1.4.2 删除断点
(gdb) clear main # 删除main函数上的断点
(gdb) clear 26 # 删除26行的断点
1.4.3 查看断点信息
1.5 watch point监视点
1.5.1 设置监视点
(gdb) watch i # 监视变量i,当i的值变化之后,gdb将停止程序运行
当所监视的变量发生变化时,gdb将停止程序运行,如下:
1.6 catchpoints
catchpoints主要是应用在当某个事件发生时,gdb将停止程序运行。
1.7 让程序运行起来
如果按照1.2中的方法进入了gdb的调试环境,并且通过浏览源代码设置了断点的话,那么如何让程序跑起来?
1. 运行待调试程序
3. 使用step进行单步调试
(gdb) step
1.8 查看变量
在程序中如何查看程序变量的值,gdb中可以使用print命令。
(gdb) print p # p为结构体类型
<2>. clewn
2.1 安装
首先下载clewn,解压,进入该目录,执行以下命令即安装完毕。
xuqiang@ubuntu:~/gdb/clewn-1.15$ ./configure
2.2 简单使用
启动clewn,clewn将启动gvim显示源代码:
xuqiang@ubuntu:~/gdb$ clewn -va debug.c
在gdb中载入二进制文件:
(gdb) file debug
那么现在可以在gvim窗口中使用ctrl+b设置断点:
shift+r开始运行程序,程序将在第一个断点处停止。常用快捷键:
L = info locals
B = info breakpoint
R = run
C = continue
S = step
需要注意的是信息将显示在gdb窗口中。
<3>. ddd
如果上面的clewn还是觉得有点复杂的话,可以使用ddd来调试程序,可以通过apt-get install ddd来安装。使用非常舒服。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?