1、前言
研究了一下GDB的使用,记录一下调试过程,学习一部分记录一部分,欢迎一起学习交流
2、GDB获取/安装
我用的Ubuntu,执行sudo apt-get install gdb即可,使用gdb --version可以查看版本
3、调试
3.1 编译程序
先贴一下测试代码:
#include <stdio.h>
int State = 0; //状态标识 0无效 就是啥都不干
void StepTest(int *pState)
{
printf("-----StepTest 1-----\n");
printf("-----StepTest 2-----\n");
printf("-----StepTest 3-----\n");
*pState = 0; //状态置无效
}
int main()
{
printf("-----start-----\n");
while(1)
{
switch(State)
{
case 1:
printf("-----Test1-----\n");
State = 0;
break;
case 2:
printf("-----Test2-----\n");
State = 0;
break;
case 3:
StepTest(&State);
break;
case 4:
printf("EXE Set Break Over\n");
State = 0;
break;
default:
break;
}
if(State == 10) // 允许进入断点
{
printf("Set Break\n");
// 断点设置在本行
State = 4;
printf("Set Break OK\n");
}
}
return 0;
}
文件名test.c,编译的时候要指定-g选项启用gdb调试,编译命令:gcc -g test.c -o test
3.2 启动调试
执行./test发起测试程序:
另起一个终端窗口,执行ps -e查看test的PID,然后执行gdb -p PID命令启动gdb调试,注意gdb调试接入后程序会暂停。
3.2.1 查看变量值
使用 p 变量名 命令可以打印程序中的全局变量的值:
3.2.2 修改变量值
使用set var 变量名=设定值 命令可以修改全局变量的值:
配合代码测试,set var State=1将状态量修改为1,执行where命令可以查看程序当前运行的位置,执行 c 命令让程序继续执行,此时可以看到状态量为1时代码的打印:
执行c命令之后程序一直在跑,在GDB处使用Ctrl+c发送信号的方式停下程序
3.2.3 设置断点
通过 b 断点行 命令可以设置断点,使用 i b 命令可以列出断点信息
配合代码进行测试,先将State值改为10,让程序可以跑进断点位置,然后执行c命令让程序继续跑起来,可以看到程序在断点处停止,然后执行命令c可以看待State = 4生效的打印:
3.2.4 单步调试
程序停止后使用 n 命令可以执行单步调试,配合程序进行调试,先执行b 29设置断点,然后将State值改为3,使用c命令让程序跑起来,程序跑到断点位置后执行n命令查看单步调试结果:
4、小结
本章写了一个小程序简单体验了一下GDB调试正在运行程序,使用到的几个命令简单总结一下:
命令 | 解释 |
p 变量名 | 打印变量值 |
set var 变量名=设定值 | 设置变量的值 |
c | 让程序执行 |
b 行号 | 设置断点 |
i b | 列出断点 |
n | 单步调试 |
后续学习新内容再更新
本文含有隐藏内容,请 开通VIP 后查看