Linux下C程序gdb调试
- Linux系统下,更改PC寄存器值
- PC寄存器:操作系统中的程序计数器。它指示了当前CPU将要读取指令的地址(即将执行的地址,即下一条指令)。
- 在gdb调试中,可通过更改PC寄存器的值
PC寄存器会存储程序下一条要执行的指令,通过修改这个寄存器的值,可以达到改变程序执行流程的目的。(有时候在gdb调试中,可能会用到跳转到某行代码行来执行)。
- 下面介绍一下如何通过修改PC寄存器的值,改变程序执行流程。
例如如下代码所示(test.c):
#include
int main(void)
{
int a =0;
a++;
a++;
printf("%dn", a);
return 0;
}
1. 首先,编译test.c文件,ubuntu终端输入命令:gcc -g test.c -o test,即可生成test可执行程序。
2. 其次,ubuntu终端输入gdb -q + 可执行文件,启动gdb进行调试:(-q参数可以屏蔽一些gdb版本等相关信息,使得页面看起来干净些(我用了),至此gdb启动完毕
gdb hello
或
gdb -q hello
3. 然后,终端输入start命令:如下所示:
4. 程序从main函数中,第一个大括号开始运行。
info line 4命令:查看第4行代码的汇编指令起始地址。
p $pc命令:查看PC寄存器的值。
第4行的代码的汇编指令起始地址 = PC寄存器的值,则说明第4行代码还未执行。
5. 第6行,也未执行,同上,第六行代码对应的汇编指令起始地址为0x55555555515c,再通过命令p $pc查看PC寄存器的值0x55555555515c,两个值相等,说明程序即将执行第六行的第一个“a++”;
6. 输入命令info line 7,查看第7行“a++”代码对应汇编地址起始地址为0x555555555160。
输入命令set var $pc=0x555555555160,即将PC寄存器设置为第7行代码对应的汇编指令地址。
接下来执行,可以看到程序输出“a=1”,也就是跳过了第一条“a++;” 语句。



