读书人

关于全局变量的监控,该怎么解决

发布时间: 2013-01-23 10:44:49 作者: rapoo

关于全局变量的监控
问题是这样的,全局变量是在公共单元中定义,并且在多个单元中引用赋值.现在我想知道在整个程序的运行中,全局变量有没有变化,是在哪个环节变化了,有没有好办法?我不可能去追踪每一句程序语句的,程序太大太复杂!
[解决办法]

引用:
我不可能去追踪每一句程序语句的,程序太大太复杂!

有源码还不知道哪里变化??
是说在exe运行时,什么时间点发生变化??
给你我的思路:
方式(1)、"find in files..." 找到所有 全局变量 改变的地方,然后 MessageBox 或者 PostMessage 或者 SendMessage WM_COPYDATA 让自己知道。
方式(2)、用Ollydbg等 在 全局变量 的地址处设个内存断点... 使得修改 全局变量 的语句断下来了...

仅供参考...
[解决办法]
写成这样的 property Name: read GetName write SetName;
就可以在setname中打断点了,运行到断点后点击delphi的菜单view->debug windows-call stack,就可以知道了。
[解决办法]
1 将全局变量改为私有变量
2 定义属性, 调用该变量, 读写方法你自己写, 就可以监控改变过程了
[解决办法]
一些调试工具如ollydbg、windbg等能断,但是得先找到全局变量的内存位置,而且断下来是汇编...
不知D里是否直接有内存断点的调试方式... 期待高手...
[解决办法]
监视它干嘛呢?既然程序已成形
[解决办法]
挂接1个SEH用来处理异常(比较区分,并处理硬件断点),用于输出信息,并继续执行程序.
然后再挂接一个SEH来把Context.Dr0设置成需要监视的内存变量的地址,把Dr7设置成$03010001 (4字节写访问,其它字节需要修改该值,String,Pointer,Ineger,DWord,Single,TObject等都是4字节)
然后故意产生一个异常,进入第二个SEH处理流程,目的是把Dr0,Dr7设置成功.然后就可以卸载第2个SEH了.

然后程序跑起来,只要有地方写入,就可以记录当前的写入数据,写入地址,等等信息

以上是硬件断点的设置和使用方法,
软断点的原理是:
把变量所在的内存段(4096字节一个段,GetSystemInfo可得到PageSize),然后设置该段为PAGE_EXECUTE_READ或者PAGE_NOACCESS,然后拦截异常,比较
PExceptionRecord
.ExceptionCode=C0000005
.ExceptionInformation[0] =0 (读异常,=1写异常)
.ExceptionInformation[1] = 异常地址(判断是否在段内)
判断是否是监视的内存地址,这里是分支处理,需要恢复内存属性,继续,等等,还需要用到int3异常来处理多线程的情况,我用的是UD2异常,这里反正有点复杂...
[解决办法]
kiboisme的方法如此高深!
[解决办法]
用个全局函数来赋值, 有些变量类型如果是多线程访问需要考虑线程安全
//不同的调用地方,传不同的AsourceFlag值
procedure SetXXXValue(A: XXX; AsourceFlag: integer=0);
begin
XXXX := A;
writelog(intotistr(AsourceFlag)); //记录哪里调用
end;

读书人网 >.NET

热点推荐