说明:文章所有内容均截选自实验楼教程【GDB 简明教程】,教程里还有更多GDB调试技巧,感兴趣的点击教程即可查看~
一、GDB 基础知识
1.GDB 相关概念
GDB, 是 The GNU Project Debugger
的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。
2.GDB 的进入和退出
如果要调试程序,需要在 gcc 编译可执行程序时加上 -g
参数,首先我们编译 bugging.c
程序,生成可执行文件:
gcc -g -o bugging bugging.c
其中 -o
指定输出文件名, 实验楼的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序。
输入 gdb bugging
进入 gdb 调试 bugging 程序的界面:
gdb bugging
在 gdb 命令行界面,输入run
执行待调试程序:
(gdb) run
在 gdb 命令行界面,输入quit
退出 gdb:
(gdb) quit
上述步骤的操作截图如下:
此处输入图片的描述3.GDB 命令行界面使用技巧
命令补全
任何时候都可以使用 TAB
进行补全,如果只有一个待选选项则直接补全;否则会列出可选选项,继续键入命令,同时结合 TAB
即可快速输入命令。
部分 gdb 常用命令一览表
命令 | 简写形式 | 说明 |
---|---|---|
list | l | 查看源码 |
backtrace | bt、where | 打印函数栈信息 |
next | n | 执行下一行 |
step | s | 一次执行一行,遇到函数会进入 |
finish | 运行到函数结束 | |
continue | c | 继续运行 |
break | b | 设置断点 |
info breakpoints | 显示断点信息 | |
delete | d | 删除断点 |
p | 打印表达式的值 | |
run | r | 启动程序 |
until | u | 执行到指定行 |
info | i | 显示信息 |
help | h | 帮助信息 |
查询用法
在 gdb 命令行界面,使用 (gdb) help command
可以查看命令的用法。
执行 Shell 命令
在 gdb 命令行界面可以执行外部的 Shell 命令:
(gdb) !shell 命令
例如查看当前目录的文件:
此处输入图片的描述二、GDB 断点
1.重新进入 debugging 调试界面
gdb bugging
2.查看源码
list 命令用来显示源文件中的代码。
通过行号查看源码
list 行号,显示某一行附近的代码:
此处输入图片的描述list 文件名 : 行号,显示某一个文件某一行附近的代码,用于多个源文件的情况。
通过函数查看源码
list 函数名,显示某个函数附近的代码:
此处输入图片的描述list 文件名 : 函数名,显示某一个文件某个函数附近的代码,用于多个源文件的情况。
3 设置断点
break 命令用来设置断点。
通过行号设置断点
break 行号,断点设置在该行开始处,注意:该行代码未被执行:
此处输入图片的描述break 文件名 : 行号,适用于有多个源文件的情况。
通过函数设置断点
break 函数名,断点设置在该函数的开始处,断点所在行未被执行:
此处输入图片的描述break 文件名 : 函数名,适用于有多个源文件的情况。
4 查看断点信息
info breakpoints 命令用于显示当前断点信息。
此处输入图片的描述其中每一项的信息:
- Num 列代表断点编号,该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
- Type 列代表断点类型,一般为 breakpoint
- Disp 列代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis)
- Enb 列代表该断点是 enable(y) 还是 disable(n)
- Address 列代表该断点处虚拟内存的地址
- What 列代表该断点在源文件中的信息
5 删除断点
delete 命令用于删除断点。
删除指定断点
delete Num,删除指定断点,断点编号可通过 info breakpoints 获得:
此处输入图片的描述删除所有断点
delete,不带任何参数,默认删除所有断点。
6 关闭和启用断点
disable 命令用于关闭断点,有些断点可能暂时不需要但又不想删除,便可以 disable 该断点。
enable 命令用于启用断点。
关闭所有断点
disable,不带任何参数,默认关闭所有断点。
关闭指定断点
disable Num,关闭指定断点,断点编号可通过 info breakpoints 获得:
此处输入图片的描述启用所有断点
enable,不带任何参数,默认启用所有断点。
启用指定断点
enable Num,启用指定断点,断点编号可通过 info breakpoints 获得。
此处输入图片的描述disable 和 enable 命令影响的是 info breakpoints 的 Enb 列,表示该断点是启用还是关闭
7 断点启用的更多方式
enable 命令还可以用来设置断点被执行的次数,比如当断点设在循环中的时候,某断点可能多次被命中。
断点 hit 一次之后关闭该断点
enable once Num
断点 hit 一次之后删除该断点
enable delete Num
实验中我们可以如下图测试该功能:
此处输入图片的描述这两个命令影响的是 info breakpoints 的 Disp 列,表示该断点被命中之后的行为
8 断点小结
断点是调试最基本的方法之一,这一节主要介绍了断点相关的知识。主要是几个断点相关的命令。
list
info breakpoints
break
delete
-
disable
和enable
-
enable once
和enable delete
不熟悉命令的时候,记得在 gdb 命令行下键入 help info breakpoints
等命令,查询帮助文档。
最后
文章所有内容均截选自实验楼教程【GDB 简明教程】,教程还介绍了以下内容:
- GDB 单步调试;
- GDB 函数栈;
- 对有问题的链表程序的调试来逐步实践挖掘程序 BUG 的过程;
对GDB不太熟悉的小伙伴点击【GDB 简明教程】即可查看~
网友评论