Linux下gdb调试改变PC寄存器得值
Linux-gdb调试更改PC寄存器值
·
一. 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++;” 语句。
更多推荐
已为社区贡献6条内容
所有评论(0)