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))"重新向下执行,也可以通过修改寄存器中的汇编地址来达到这一操作:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?