源码的搭建环境可以参考下面这篇文章
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里提供的一个接口函数。