Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

## 这篇博客主要是用来记录前些天复习GDB调试的过程

调试前的准备

Linux C/C++开发环境和编译调试(一)
需要关闭-o,打开-g,打开-Wall
来看一下加入代码调试信息(-g)之后生成的可执行文件大小和没加的对比:

root@ziggy-virtual-machine:~/learn_gdb# gcc -g test.c -o demo1 
root@ziggy-virtual-machine:~/learn_gdb# gcc test.c -o demo_g 
root@ziggy-virtual-machine:~/learn_gdb# ll -h demo1 demo_g 
-rwxr-xr-x 1 root root  10K 10月 31 12:07 demo1*
-rwxr-xr-x 1 root root 8.6K 10月 31 12:08 demo_g*

GDB命令

启动:
(1)打开gdb调试:

#格式:gdb [exec_filename]
#例如:
gdb demo1

Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

退出:quit

(2)为程序设置参数/获取设置的参数(为程序设置命令行参数,获取参数列表)

set args 5 8
show args

Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
如果不加-g的编译选项,则未向可执行文件中加入源代码信息,所以无法在gdb中查看源码
(3)查看程序源码:

#1.查看当前文件:
list/l(默认位置显示)
list/l 行号
list/l 函数名
#2.查看非当前文件:
list/l 文件名:行号
list/l 文件名:函数名
#3.设置显示的行数
show list/listsize
set list list/listsize 行数

Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
如果按回车,则默认继续输入list,继续显示下面的代码片段

多文件情况:

root@ziggy-virtual-machine:~/learn_gdb# g++ -o demo_multi bubble.cpp main.cpp select.cpp -g

默认显示main函数:
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
如果想要看其他源文件:使用l filename:行号l filename:函数名
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

设置断点

#1.设置断点
b/break 行号
b/break 函数名
b/break 文件名:行号
b/break 文件名:函数
#2.查看断点
i/info b/break
#3.删除断点
d/del/delete 断点编号(这个编号是info查出的)
#4.设置断点效果:
dis/disable 断点编号(设置断点无效)
enable 断点编号(设置断点有效)
#5.设置条件断点
b/break 10 if i==5

设置条件断点:
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

运行程序

start:程序停在第一行
run:遇到断点才停
c/continue:继续运行,直到下一个断点
n/next:向下执行一行代码(不进入函数体)
s/step:但不调试(可以进入函数体)
finish :跳出函数体
p/print 变量名:打印变量值
ptype 变量名:打印变量类型
set var 变量名=变量值
until:跳出循环
自动变量:
display num(自动打印指定变量的值)
i/info display
undisplay 编号

先设置断点:b 8

再运行代码直到达到断点(还未执行断点所在的那行)
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
使用c,继续运行,直到到达下一个断点
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
使用n向下执行一行代码(不可进入函数体),使用s可进行单步调试(可进入函数体,使用finish跳出函数体)
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

print不能自动在s单步调试时自动打印所指定的变量值,但是display可以
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
使用display自动打印指定变量值,i display查看已设置为自动打印的变量值,undisplay 编号用于取消某个编号的变量的自动打印,注意这里的编号是i display中第一列的值
finish跳出函数
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

条件断点:
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试
设置变量值
len为5,我们设置i = 4,使其下一次即跳出循环
Linux C/C++开发环境和编译调试(二)详细记录如何使用GDB进行调试

上一篇:mysql – 检测锁定表(由LOCK TABLE锁定)


下一篇:linux调试工具-gdb安装使用