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

一、寄存器查看命令

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

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

调试代码如下所示:

调试代码下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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))"重新向下执行,也可以通过修改寄存器中的汇编地址来达到这一操作:

posted @   TechNomad  阅读(2163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示