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里提供的一个接口函数。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/113828847
今日推荐