补充实验:GDB调试

2023-03-28 17:11:25 浏览数 (1)

1. 创建工作目录

目录命名为班级加姓名的格式,如 1banz3

参考代码:

代码语言:shell复制
mkdir 1banz3
# 切到 1banz3 目录:
cd 1banz3

2. 新建 C 文件

代码语言:shell复制
# 新建 test.c 文件
touch test.c
# 编辑 test.c 文件
vi test.c

输入以下代码

代码语言:c复制
#include<stdio.h>
void func()
{
    int i;
    for(i=2;i>=0;i--)
    printf("The result is %dn",10/i);
}
void main()
{
    func();
}

这段代码中有错误,需要在后续的调试过程中修复,所以先不更正错误的代码。

可以使用cat命令查看文件的内容,如查看test.c:cat test.c

3. 编译 C 程序

代码语言:shell复制
#编译test.c文件,生成可执行文件test
gcc -g test.c -o test

使用-g选项表示编译过程中生成调试信息,从而支持在后续使用GDB调试工具。

4. 运行可执行程序

代码语言:shell复制
./test

因为代码中存在错误,所以在运行过程中遇到了浮点数例外问题

5. 使用GDB调试工具

代码语言:shell复制
#键入gdb命令,回车确认,进入gdb程序中
gdb

如果提示没有gdb指令,可以运行sudo yum install gdb安装GDB调试工具 安装过程中,提示做选择时可以输入y按回车继续 (简单的说就是会出现两次选择,都按y然后按enter继续)

启动GDB后,某些行前面会显示(gdb)提示符,所以gdb指令都输在(gdb)提示符的后面。

6. 调试test可执行程序

(gdb)提示符后边输入file test命令装入要调试的可执行程序test。

提示Reading symbols from test...done.表示装入完成。

7. 运行test程序

(gdb)提示符后边输入run命令运行当前装入的程序,也就是test程序。

此时提示程序在第6行出错,也就是10/i操作引发了异常。

代码语言:txt复制
Program received signal SIGFPE, Arithmetic exception.

0x000000000040113d in func () at test.c:6

6	    printf("The result is %dn",10/i);

8. 查看变量

(gdb) 提示符后边输入 print i 命令查看此时i变量的值。

可以看到 $1 = 0 ,所以是10/0运算引发了除0异常

9. 断点调试

(gdb)提示符后边输入list命令查看前后5行代码及行号。

(gdb)提示符后边输入break 6命令,表示在6行设置断点,程序运行到该断点会等待用户输入信息再进行到下一步。

设置断点后可以输入run命令运行程序。

如果提示

The program being debugged has been started already. Start it from the beginning? (y or n) 可以按 y 和回车后继续。

程序运行到断点处会等待用户输入,此时可以输入next进行到下一个断点。

10. 监控变量的值

  • 输入run命令运行程序。
  • 输入watch i命令监控变量i的变化。
  • 监控设置完成后,输入next进行断点调试。

当变量i的值发生更新,GDB调试工具会输出该内存区域的变化:

代码语言:txt复制
Old value = 2
New value = 1

11. 终止调试程序

调试完成后,输入kill可以终止正在调试的程序。

如果提示

Kill the program being debugged? (y or n) 表示询问用户是否确认终止程序,输入y表示肯定,n表示否定。

12. 退出GDB调试

输入quit可以退出GDB程序,回到Linux Shell。

gdb

0 人点赞