介绍
安装
检查软件包列表版本
安装
gdb安装
cgdb安装
验证安装
使用
注意事项
常用命令
cgdb中
gdb/cgdb中
1.读取可执行程序格式
2.列出代码
3.打断点
4.删除断点
5.查看断点
6.禁用断点
7.查看信息
8.调试
小知识
介绍
gdb(GUN Debugger):是一个命令行调试工具,主要用于C/C++语言编写的程序。
cgdb:gdb的增强版,提供了一个友好的用户界面,上部显示源代码,下部为gdb命令行。
安装
CentOS 中使用yum,Ubuntu中使用apt。 关于yum和apt的介绍,在之前的文章中有。
检查软件包列表版本
首先,确保软件包列表是最新的,
sudo yum/apt update
安装
gdb安装
sudo yum/apt install gdb
对于CentOS 8及以上版本
sudo dnf install gdb
cgdb安装
对于Ubuntu,直接安装cgdb即可
sudo apt install cgdb
CentOS默认的软件仓库中没有cgbd,安装需要进行源码编译安装
1.安装依赖
sudo yum install git automake autoconf flex texinfo ncurses-devel
如果是CentOS 8及以上版本
sudo dnf install git automake autoconf flex texinfo ncurses-devel
2.下载cgdb源码
git clone https://github.com/cgdb/cgdb.git
cd cgdb
3.编译和安装
sh autogen.sh
./configure
make
sudo make install
验证安装
gdb/cgdb --version
使用
注意事项
1.可执行的二进制文件才能进行调试
2.只有带调试信息的可执行二进制文件才可以调试,gcc/g++默认以无调试信息的版本发布,使用-g选项可以发布debug版本的可执行程序。
gcc/g++ 源文件 -g
3.gdb/cgdb 文件名 :进入调试,但只是进入调试,并不会运行程序。
常用命令
cgdb中
:break:在光标所在行设置断点。
/:在源代码窗口中搜索文本。
i:切换到 GDB 命令行窗口。
ESC:切换到源代码窗口。
gdb/cgdb中
1.读取可执行程序格式
readelf -S 文件名
2.列出代码
l/list :显示从文件开始位置的代码,继续输入l/list或者enter会继续向下显示。
l/list 行号:显示指定行号附近的代码
l/list 函数名:显示指定函数的代码
l/list 起始行号,结束行号:显示指定区间代码
l/list 文件名:行号 or l/list 文件名:函数名 :GDB 会显示指定文件中特定行号或函数的代码。
3.打断点
断点按编号来操作
b 行号
在指定行打断点
b 文件名:函数名/行号
在指定位置打断点
b 行号 if 条件表达式
在指定行打条件断点
condition 断点编号 条件表达式
更改条件断点条件,或者给普通断点加条件
4.删除断点
d 断点编号
删除断点
d breakpoints
删除所有断点
5.查看断点
info b
查看断点信息
6.禁用断点
disable 断点编号
禁用指定断点
disable breakpoints
禁用所有断点
enable 断点标号
启用指定断点
enable breakpoints
启用所有断点
7.查看信息
info b
查看断点信息
info i
查看当前正在debug的程序信息
info local
显示当前函数或作用域中所有局部变量的信息
8.调试
r(run)
开始调试
注:就是启动程序开始运行,如果无断点,会直接运行至程序结束。
n(next)
逐过程调试,不进入函数
s(step)
逐语句调试,进入函数
until 行号
执行到指定行
c(continue)
跳到下一个断点,如果无断点,结束运行
finish
执行到当前函数返回停止
p 变量
查看变量值
p &变量
查看变量地址
display 变量/&变量
设置为常显示
undisplay 编号(display生成的常显示的变量的编号)
取消常显示
bt(backtrace)
查看调用堆栈
watch 变量
如果调试中watch变化会通知
set var 变量 = 值
更改此次调试中变量的值,不会修改代码
小知识
1.回车:将光标移动到当前行的开头
2.对于rand这个函数,如果将srand这个设置随机数种子的函数注释掉,只要不重新编译,再次运行产生的随机值不变