一. Linux系统下,更改PC寄存器值

1. 在gdb调试中,可通过更改PC寄存器的值

Linux开发中,通过修改 Linux 系统中的 PC 寄存器,可以达到改变程序执行流程的目的。(有时候在 gdb 调试中,可能会用到跳转到某行代码行来执行)。
PC 寄存器: 操作系统中的程序计数器。它指示了当前CPU将要读取指令的地址(即将执行的地址,即下一条指令)。

2. 下面介绍一下如何通过修改PC寄存器的值,改变程序执行流程。

例如,如下代码所示(test.c):

#include <stdio.h>
int main(void)
{       
        int a =0;               
        a++;    
        a++;    
        printf("%d\n", a);      
        return 0;
}
(1) 首先,编译test.c文件,ubuntu终端输入命令:gcc -g test.c -o test,即可生成test可执行程序。如下图所示:

在这里插入图片描述

(2) 其次,ubuntu终端输入gdb -q + 可执行程序,启动gdb进行调试(-q参数可以去掉一些gdb版本等信息的打印,使得页面看起来干净些),至此gdb启动完毕。输入如下命令:
gdb test 或 gdb -q test

如下所示:

在这里插入图片描述

(3) 其次,输入start命令。如下所示:

在这里插入图片描述

(4) 程序从main函数中第一个大括号开始运行。

info line 4 命令:查看第4行代码的汇编指令起始地址。
p $pc 命令:查看PC寄存器的值。

如下所示:

在这里插入图片描述

(5) 使程序单步运行。

输入 n 命令可以使程序继续向下执行。程序运行到第 6 行。
第4行的代码的汇编指令起始地址 = PC寄存器的值,则说明第4行代码还未执行。
第6行代码对应的汇编指令起始地址为0x55555555515c, 再通过p $pc 命令查看 PC 寄存器的值0x55555555515c,两个值相等,说明程序即将执行第六行的第一个“a++”;
如下所示:

在这里插入图片描述

(6) 更改 PC 寄存器的值。

输入命令info line 7,查看第7行“a++”代码对应汇编地址起始地址为0x555555555160。
输入命令set var $pc=0x555555555160,即将PC寄存器设置为第7行代码对应的汇编指令地址。

如下所示:

在这里插入图片描述

接下来执行,可以看到程序输出“a=1”,也就是跳过了第一条“a++;” 语句。

Logo

更多推荐