GDB用法(一)

一、编译c:编译命令使用-g参数,向可执行程序中加入调试信息,包括源代码、符号表等,GDB 需要这些额外的信息来完成调试工作。

gcc  test.c -o main.o -g

二、启动GDB:使用-silent参数,屏蔽 GDB 的前导信息(GDB免责条款)

gdb test.out -silent

Reading symbols from main.o...done.
(gdb)

三、设置断点:b(break)命令设置断点,

(gdb)b 函数名称,如:b main; 显示结果:

Breakpoint 1 at 0x10040108d: file main.c, line 4.

  (gdb) b 行号,如:b 5;

  (gdb) b * 内存地址,如:b * 0x10040108d

四、运行程序: r(run)命令运行程序

(gdb) r
Starting program: /home/gao/test/test1/main.o
[New Thread 9984.0x2144]
[New Thread 9984.0x2310]
[New Thread 9984.0xe50]
[New Thread 9984.0x2f30]

Thread 1 "main.o" hit Breakpoint 1, main () at main.c:4
4           n = 1;
在运行了被调试的程序后,GDB 的输出信息显示程序己经启动,下一个将要执行的语句是第 4 行的n = 1;

注意,这条语句并没有执行,而仅仅是告诉你,再继续执行程序的话,执行的语句会是它。

五、查看打印变量:p(print)命令打印变量值

(gdb) p n
$1 = 0
(gdb) p sum
$2 = 4294954103


GDB 先计算表达式的值,并把它保存在一个存储区中,存储区的名字用$外加数字来表示,并且这个数字会随着调试过程的进行而不断递增(这意味着存储区也是不断开辟的)。以上,第一个 p 命令执行后,GDB 的回应是$1 = 0,意思是表达式 n 的值保存在 $1 中,其内容为 0。

注意,在你的计算机上,变量 n 和 sum 的当前值可能和这里显示的不同。这很好理解,内存是反复使用的,当一个程序终止后,它占用的内存会分配给其他程序使用;当一个变量不再使用后,它占用的内存也会重新分配,并成为另一个变量。因为变量 n 和 sum 刚刚分配,还没有往里面保存任何数值,故它们的内容是随机的,是其他程序或者变量用过的垃圾值。

六、单步执行:n(next)命令运行到下一行

(gdb) n
5           sum = 0;
执行 n 命令后,实际执行的是第 4 行n = 1;,GDB 显示下一个即将执行的源代码行,也就是第 5 行的sum = 0;

(gdb) n
6           while (n <= 100)

继续执行n命令后,用p n;p sum监视n和sum的值,可见:

(gdb) p n
$3 = 1
(gdb) p sum
$4 = 0
也可以用p{n, sum}命令监视n和sum的值

(gdb) p{n, sum}
$5 = {1, 0}
七、列出原文件内容:l(list)命令

(gdb) l
4           n = 1;
5           sum = 0;
6           while (n <= 100)
7           {
8               sum = sum + n;
9               n = n + 1;
10          }
11          return 0;
12      }

l 命令默认每次显示 10 行源代码,如果没有显示下我们想要看的代码,可以继续运行l命令

八、继续运行程序:c(continue)命令

可以用一个新的命令c或者continue来持续执行程序,直至遇到断点或者程序结束

九、退出程序:q(quit)命令

q或者quit结束本次调试工作,这将使得调试器 GDB 结束运行并返回到操作系统

 

以上内容参照:http://c.biancheng.net/gdb/

### GDB调试器使用方法 #### 编译带有调试信息的程序 为了能够有效地利用GDB进行调试,编译源代码时应当加入`-g`参数以便包含必要的调试信息。例如,如果有个C文件名为`test.c`,可以通过下面这条指令将其编译成可执行文件: ```bash gcc -g test.c -o test ``` 此操作会在生成的目标文件中嵌入额外的信息用于支持后续的调试工作[^3]。 #### 启动GDB并加载目标程序 启动GDB的方式很简单,只需在终端输入`gdb`加上待调试的应用名称作为参数即可。比如针对上面提到的例子可以这样调用: ```bash gdb ./test ``` 旦进入GDB环境之后,就可以通过系列命令来进行断点设置、单步执行以及变量查看等动作了[^1]。 #### 基础命令概览 以下是几个常用的GDB基础命令列表: - `run`: 开始运行被调试的程序; - `breakpoint function_name/line_number`: 设置断点于指定函数或者某行处; - `continue`: 继续执行直到遇到下个断点为止; - `next`: 执行下条语句而不深入子过程内部; - `step`: 进入当前行所调用的方法体内继续跟踪其逻辑流程; - `print variable/expression`: 显示特定变量或表达式的值; 这些只是入门级别的功能介绍,实际上GDB还提供了许多高级特性供更复杂的场景需求使用[^2]。 #### 安装方式简介 对于大多数现代Linux发行版而言,默认情况下已经预装好了GDB工具链。如果没有的话,则可以根据具体平台选用合适的包管理器来完成安装任务。例如,在基于Debian系统的机器上可通过如下命令快速部署最新稳定版本: ```bash sudo apt-get update && sudo apt-get install gdb ``` 而对于RedHat系操作系统则应采取yum/yumdnf途径实现相同目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值