gdb调试基础

gcc -g hello.c -o hello

gdb hello

选项 l list p print r run n next b breakpoint s step   c continue


单步调试
  n或s 区别 n 不能进入函数体 就是跳过函数体 而s可以进入函数体。 

Gdb 基本命令
1.工作环境相关命令
Gdb 中不仅可以调试所运行的程序,
而且还可以对程序相关的工作环境进行相应的设定,
甚至还可以使用 shell 中的命令进行相关的操作,其功能极其强大。表 3.10 所示为 Gdb 常见
工作环境相关命令。
表 3.10
Gdb 工作环境相关命令
命 令 格 式
set args 运行时的参数 指定运行时参数,如 set args 2
show args 查看设置好的运行参数
path dir 设定程序的运行路径
show paths 查看程序的运行路径
set enVironment var [=value] 设置环境变量
show enVironment [var] 查看环境变量
cd dir 进入到 dir 目录,相当于 shell 中的 cd 命令
pwd 显示当前工作目录
shell command 运行 shell 的 command 命令

设置断点与恢复命令
Gdb 中设置断点与恢复的常见命令如表 3.11 所示。
表 3.11
Gdb 设置断点与恢复相关命令
命 令 格 式
bnfo b 查看所设断点
break 行号或函数名 <条件表达式> 设置断点
tbreak 行号或函数名 <条件表达式> 设置临时断点,到达后被自动删除
delete [断点号] 删除指定断点,其断点号为“info b”中的第一栏。若缺省断点
                                                                    号则删除所有断点
disable [断点号]] 停止指定断点,使用“info b”仍能查看此断点。同 delete 一样,
                                                                  省断点号则停止所有断点
enable [断点号] 激活指定断点,即激活被 disable 停止的断点
condition [断点号] <条件表达式> 修改对应断点的条件
ignore [断点号] 在程序执行中,忽略对应断点 num 次
step 单步恢复程序运行,且进入函数调用
next 单步恢复程序运行,但不进入函数调用
finish 运行程序,直到当前函数完成返回
c 继续执行函数,直到函数结束或遇到新的断点


由于设置断点在 Gdb 的调试中非常重要,所以在此再着重讲解一下 Gdb 中设置断点的
方法。
Gdb 中设置断点有多种方式:其一是按行设置断点,设置方法在 3.5.1 节已经指出,在此
就不重复了。另外还可以设置函数断点和条件断点,在此结合上一小节的代码,具体介绍后
两种设置断点的方法。
1 函数断点
Gdb 中按函数设置断点只需把函数名列在命令“b”之后,如下所示:
(gdb) b sum
Breakpoint 1 at 0x80484ba: file test.c, line 16.
(gdb) info b
Num Type Disp Enb Address
1 keep y
breakpoint
What
0x080484ba in sum at test.c:16
要注意的是,此时的断点实际是在函数的定义处,也就是在 16 行处(注意第 16 行还未
执行)
2 条件断点
Gdb 中设置条件断点的格式为:b 行数或函数名 if 表达式。具体实例如下所示:
(gdb) b 8 if i==10
Breakpoint 1 at 0x804848c: file test.c, line 8.
(gdb) info b
Num Type Disp Enb Address
1 keep y
breakpoint
What
0x0804848c in main at test.c:8
stop only if i == 10
(gdb) r
Starting program: /home/yul/test
The sum of 1-m is 1275
Breakpoint 1, main () at test.c:9
9
n += i;
(gdb) p i
$1 = 10
可以看到,该例中在第 8 行(也就是运行完第 7 行的 for 循环)设置了一个“i==0”的
条件断点,在程序运行之后可以看出,程序确实在 i 为 10 时暂停运行。

3.Gdb 中源码查看相关命令
在 Gdb 中可以查看源码以方便其他操作,它的常见相关命令如表 3.12 所示。
源码查看相关相关命令
命 令 格 式
含义
list <行号>|<函数名> 查看指定位置代码
file [文件名] 加载指定文件
forward-search 正则表达式 源代码前向搜索
reverse-search 正则表达式 源代码后向搜索
dir dir 停止路径名
show directories 显示定义了的源文件搜索路径
info line   显示加载到 Gdb 内存中的代码
4.Gdb 中查看运行数据相关命令
Gdb 中查看运行数据是指当程序处于“运行”或“暂停”状态时,可以查看的变量及表
达式的信息,其常见命令如表 3.13 所示:
表 3.13
Gdb 查看运行数据相关命令
命 令 格 式
print 表达式|变量 查看程序运行时对应表达式和变量的值
x 查看内存变量内容。其中 n 为整数表示显示内存的长度,f 表示显示
                                                                  的格式,u 表示从当前地址往后请求显示的字节数
display 表达式 设定在单步运行或其他情况中,自动显示的对应表达式的内容
5.Gdb 中修改运行参数相关命令
Gdb 还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设
置方法为:在单步执行的过程中,键入命令“set 变量=设定值”
。这样,在此之后,程序
就会按照该设定的值运行了。下面,笔者结合上一节的代码将 n 的初始值设为 4,其代码如
下所示:
(Gdb) b 7
Breakpoint 5 at 0x804847a: file test.c, line 7.
(Gdb) r
Starting program: /home/yul/test
The sum of 1-m is 1275
Breakpoint 5, main () at test.c:7
7
for(i=1; i<=50; i++)
(Gdb) set n=4
(Gdb) c
Continuing.
The sum of 1-50 is 1279
Program exited with code 031.
可以看到,最后的运行结果确实比之前的值大了 4。
Gdb 的使用切记点:
在 Gcc 编译选项中一定要加入“-g”
• 只有在代码处于“运行”或“暂停”状态时才能查看变量值。
• 设置断点后程序在指定行之前停止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值