gdb的基本使用
- 前言
- 准备gdb工具
- 调试须知
- gdb的基本指令
- 进入调试
- 退出调试
- 显示代码及函数内容
- 运行程序
- 给程序打断点
- 查看断点位置
- 断点使能
- 取消断点
- 逐过程调试
- 逐语句调试
- 运行到下一个断点
- 查看变量的值
- 变量值常显示
- 取消变量值常显示
前言
在主页前面的几篇文章已经介绍了Vim编辑器及Makefile编译工具的使用。但在实际编程中往往事与愿违,所写代码中有一些小bug需要修改一下。
用过Vs的应该知道,我们调试需要知道程序执行的某一个细节,包括变量的值、函数的调用过程等从而发现隐藏的错误代码。
但是Linux没有图形化界面,所以需要借助工具来进行代码调试,当然这个工具对于初学者可能会不太适应。
准备gdb工具
首先检查一下自己Linux是否安装有gdb工具
命令:gdb -v
作用:查看gdb的版本号
如果显示出gdb的版本,则说明已经安装。
如果没有安装则根据以下操作
命令:yum -y install gdb
作用:安装gdb
调试须知
可执行程序有两种编译版本,一个是Debug版本另一个是Release版本
Debug 通常称为调试版本,它包含调试信息,并且不作程序优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,但其不包含调试信息。
为什么要先对这两个版本进行解释呢?因为Linux下gcc/g++默认编译出的版本为Release版本;是不带调试信息的无法使用 gdb 工具对其进行调试。
如下图
实际上使用gcc/g++进行编译,如果我们需要Debug版本时需要在编译指令上加 -g 命令。
如:gcc -o testDebug test.c -g
总结:
1:程序的编译有两种一个是Debug版本另一个是Release版本
2:Linux下gcc/g++的默认编译方式是编译出Release版本
3:要用gdb调试工具就必须在编译时加上 -g 选项,使其可执行程序为Debug版本
gdb的基本指令
首先咱看一下本文所用的被调试文件test.c中的代码如下
下面是我总结的命令,后面我会示范一些常用的给大家
gdb 文件名 :进入调试
q :退出gdb
l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
l 函数名:列出某个函数的源代码。
r :运行程序
b 行号:在某一行设置断点
b 函数名:在某个函数开头设置断点
info b :查看所有信息。
d break:删除所有断点
d 断点编号 :删除序号为n的断点
disable breakpoints 断点编号:禁用断点
enable breakpoints 断点编号:启用断点
n :单条执行。
s :逐语句调试/进入函数调用
finish:执行到当前函数返回,然后挺下来等待命令
p 变量:打印变量值。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
info(或i) breakpoints:参看当前设置了哪些断点
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
进入调试
命令:gdb 文件名
作用:启动调试
注意:只是启动调试,程序并没有运行
如下图:
退出调试
命令:q
作用:退出调试
显示代码及函数内容
命令:l
作用:显示当前执行代码及周围10行,l 的特点是每次只显示10行
命令:l 行号
作用:显示指定行号内容
命令:l 行号,行号
作用:显示指定行号内的内容,如下图 l 7,11 命令表示显示7到11行的内容。这种命令方式因为是指定式的所以可显示10行以上的内容。
命令:l 函数名
作用:显示函数代码
运行程序
命令 :r
作用:运行程序
注意:此命令和Vs中的F5功能一致,运行过程中遇到断点才会停下,如果没遇到断点程序会直接运行致结束。
给程序打断点
命令:b 行号
作用:给指定行号打断点方便调试
查看断点位置
命令:info b
作用:查看程序中各断点位置
解释:
Num : Num下方是断点编号(取消断点时需要用到断点编号)
Type : 表示该标记是断点
Enb : 代表使能,y代表打开, n代表关闭
what : 表示改断点在那个函数和文件中及在第几行
断点使能
命令:disable breakpoint 断点编号
功能:该断点使能关闭(该断点功能不生效)
命令:enable breakpoint 断点编号
功能:该断点使能打开(该断点功能生效)
取消断点
命令: d 断点编号
作用:取消该断点
注意:取消断点用的是断点编号(用info b 查看),不是用行号;
命令:d break
作用:取消所有断点
逐过程调试
命令: n
功能:逐过程调试(和vs调试时的F10一致)
逐语句调试
命令:s
功能:逐语句调试
运行到下一个断点
命令:c
作用:运行到下一个断点
查看变量的值
命令:p 变量
功能:查看变量的值
命令:p &变量
功能:查看变量的地址
变量值常显示
上一个命令 p ,只能显示一次变量的值。如果我们想一直看着变量的变化就得用其他命令。
命令:display 变量名(或取地址)
功能:跟踪显示某个变量的值,每次停下都显示他的值
取消变量值常显示
命令:undisplay 编号
功能:取消变量值常显示