gdb源码中的print命令实现

源码的搭建环境可以参考下面这篇文章
windows下编译gdb源码

首先随便写了个测试程序

  int c = 51115;
  int b[10] = {0};
  int *p = malloc(40);
  sprintf(b,"%p",p);
  c +=b[0]&0xff; //随便赋一个非常量值,如果是常量的话编译时就直接算好写到PE文件里了
  printf("%d\n",c); //这里是86行,打印出来是51163

gdb脚本如下,文件名是sdx.txt,执行时加上-command=sdx.txt

file /d/ssd/Debug/ssd.exe
b 86
r
p c

执行结果如下,我在源代码里还加了一些其他打印,不必关注
在这里插入图片描述
接下来单步调试,先把断点停在执行打印的地方,可以看到打印的值存在val这个变量里
在这里插入图片描述
接下来找到对val赋值的地方,可以看到是从src里来的
在这里插入图片描述

再来看看src的值是从哪里来的,从下图可以知道是从regcache里取出来的
在这里插入图片描述
那么regcache的值又是从哪里来的呢,继续调试,是在current_thread->context的Rbx寄存器里
在这里插入图片描述
最后可以追溯到Rbx的源头,是调用了GetThreadContext,这个就是底层的windows debug api里提供的一个接口函数。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值