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
操作引发了异常。
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。