GDB调试入门(一)

当代码量较多时,使用GDB调试代码可以相对便捷的定位错误点,提高Dbug效率。

首先先熟悉下GDB调试的基本流程:

  1. 在编译代码是添加 gcc添加–g选项

    :gcc -g test.c -o test.out

  2. 然后在bash环境中使用GDB 命令调用编译生成程序:

    :gdb ./test.out

进入调试页面
在这里插入图片描述
在这个界面下我们可以通过一些GDB的常用命令进行代码的细节调试,常用命令如下:

运行该程序:run(简写r)

查看代码:list(简写l)

打断点:break(简写b)后跟行号(或者函数名、文件名:行号)

查看所有断点:info break

跳转到下一断点处:continue(简写c)

删除断点:delete(简写d)断点编号

单步执行:next(简写n)

进入函数:step(简写s)

查看变量的值:print(简写p)变量名(只显示一次)

查看变量的值,并且使其动态改变:display 变量名(一直显示,并且动态变化)

删除10中变量的显示:undisplay 变量号(非变量名)

跳到某行:until 行号(中途有断点则暂停到断点处)

查看调用堆栈:bt

执行完当前的函数:finish

设置变量的值:set var 变量名 = 值

关闭断点:disable 断点号

开启断点:enable 断点号

执行上一次的指令:Enter按键

退出gdb:quit(简写q)

start           #开始调试,停在第一行代码处,(gdb)start
l               #list的缩写查看源代码,(gdb)l
b <lines>       #b: Breakpoint的简写,设置断点。(gdb) b 8 
b <func>        #b: Breakpoint的简写,设置断点。(gdb) b main
clear 			 #命令后面的参数为设置断点的行号,clear后面参数还可以加设置断点的函数名。
delete		#命令后面的参数为断点的编号;可以一次删除多个断点,断点编号之间用空格隔开;如果delete后没有参数,默认删除所以断点,会给出提示选择是否操作。
i breakpoints   #i:info 的简写。(gdb)i breakpoints
d [bpNO]        #d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。(gdb)d 1

s               #s: step执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;(gdb) s
n               #n: next执行一行源程序代码,此行代码中的函数调用也一并执行。(gdb) n
​
r               #Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。(gdb) r
c               #Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。(gdb) c
finish          #函数结束
​
p [var]             #Print的简写,显示指定变量(临时变量或全局变量 例如 int a)的值。(gdb) p a
display [var]       #display,设置想要跟踪的变量(例如 int a)。(gdb) display a
undisplay [varnum]  #undisplay取消对变量的跟踪,被跟踪变量用整型数标识。(gdb) undisplay 1
set args            #可指定运行时参数。(gdb)set args 10 20
show args           #查看运行时参数。
q                   #Quit的简写,退出GDB调试环境。(gdb) q 
help [cmd]          #GDB帮助命令,提供对GDB名种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。(gdb)help
回车                #重复前面的命令,(gdb)回车

首先我们可以使用list显示当前程序入口代码:
在这里插入图片描述
在调试的关键点上使用break命令添加断点,并是可以使用info break查看断点:
在这里插入图片描述
添加断点后可以使用run命令开始运行程序,程序将运行至第一个断点处:
在这里插入图片描述
程序运行后使用 print 命令查看当前的变量值
在这里插入图片描述
使用 next 命令可以进行单步调试,每次执行一行,同样可以使用print 命令查看变量变化
在这里插入图片描述
如果需要重复关注变量值,可以使用display命令这样每次执行暂停后都会自动显示变量值

在这里插入图片描述
如果想停止调试,可以执行quit命令退出调试界面。

在这里插入图片描述
其他命令大家可以自行尝试,比如continue可以直接从当前位置直接执行到下一个断点处,使用的频率也比较高,这里不在复述。–孟德慧。

在日常调试中,我们经常会遇到段错误。使用gdb可以可以很容易的找到错误的根源。

首先,重新使用–g选项编译出错代码。并正常运行直至其出段错误。测试代码如下:
在这里插入图片描述
段错误触发后,同目录下回生成一个core文件,里面保存的是段错误相关信息。如果core文件没有生成,则是因为系统默认core文件大小为0,可以运行ulimit -c 10000来设置core文件容量,然后重新执行程序。

得到core文件后,使用gdb./test core 来查看出错代码所在位置。
在这里插入图片描述
并可以执行run命令在gdb调试界面下直接运行程序,使段错误再次出现。
在这里插入图片描述
之后执行 pirnt命令来查看出错行相关数值来确认错误信息:确定*p为空指针操作(实际代码中更多的可能是野指针或越界操作)。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值