GDB调试之寄存器查看与修改(六)

发布时间 2024-01-13 12:35:36作者: TechNomad

一、寄存器查看命令

命令:"i register"查看所有的寄存器,如果只想查看指定的寄存器,则使用"i r 寄存器名称",如"i r rdi",寄存器的名称列表如下所示:

函数参数低于六个的时候,会把参数放在寄存器中,当函数参数高于六个参数的时候,就不会把参数放在寄存器中,而是放在函数栈中。

调试代码如下所示:

调试代码下载地址

#include <iostream>
#include <cstring>
using namespace std;
struct test_struct
{
	char name[12];
	char gender;
	int age;
};
int test_fun(const char* name,int age,int gender)
{
	test_struct test;
	memset(&test,0,sizeof(test));
	strcpy(test.name,name);
	test.age = age;
	test.gender = gender;
	return 0;
}

int main(int argc,char** argv)
{
	test_fun("SimpleSoft",25,'m');

	return 0;
}

如果在编译的时候不添加-g参数,那么生成的程序将不会生成调试符号,所以我们在调试过程中,通过p命令或者别的命令去查看这个变量或者函数参数的话,将不会看到变量或者参数的值。

所以此时我们需要通过寄存器的方式去查看变量或者参数的值:

二、寄存器修改命令

pc/rip(program counter)寄存器,保存程序下一条要执行的指令,通过修改pc寄存器来改变程序执行的流程。修改寄存器的常用命令:

  • set var $pc=xxx
  • p $rip=xxx

查看源代码的汇编地址:"info line 行数"

比如上述代码执行到"return 0"后,想要从语句"memset(&test,0,sizeof(test))"重新向下执行,也可以通过修改寄存器中的汇编地址来达到这一操作: