问题是这样的,全局变量是在公共单元中定义,并且在多个单元中引用赋值.现在我想知道在整个程序的运行中,全局变量有没有变化,是在哪个环节变化了,有没有好办法?我不可能去追踪每一句程序语句的,程序太大太复杂!
解决方案 »
- Virtual tree view 怎样获取指定level和index下的节点?
- Delphi的Enterprise和c/s版有什么区别
- 多字段建树~
- >>>> 有关 MMTools 控件包的用法问题 <<<<<
- 请问怎么判断鼠标已经移出了treeview的范围???
- 怪!!!!!!!!!!
- 请问:该篇中的VC代码如何改写为delphi6的代码
- delphi 中数据转换出错,求大侠帮忙
- 请问在delphi 内如何获知当前系统为nt 或 win9x?
- 谁能写出这个控件,给5000分!!!
- delphi 中提取 webbrowser鼠标单击的超链接的文字内容
- delphi插入数字相反的值失败,大家帮我看一下。
是说在exe运行时,什么时间点发生变化??
给你我的思路:
方式(1)、"find in files..." 找到所有 全局变量 改变的地方,然后 MessageBox 或者 PostMessage 或者 SendMessage WM_COPYDATA 让自己知道。
方式(2)、用Ollydbg等 在 全局变量 的地址处设个内存断点... 使得修改 全局变量 的语句断下来了...仅供参考...
就可以在setname中打断点了,运行到断点后点击delphi的菜单view->debug windows-call stack,就可以知道了。
你说的第一点,我早就想到了,只是程序太大,需要设断点的地方有几万处,程序过程函数单元又是交叉引用的,所以这个办法最有效,但是却最难实行.
第二点,Ollydbg是个什么工具没用过,能否介绍详细一点.回xiaojun5556:
你说的办法也很好,至少可以解决很多问题,不过我现在的任务不是程序设计,而是程序分析,程序已经成形,不方便再改.
如果有什么办法直接监视内存,再能自动在其值变化的时候,产生断点,就好了.
不知D里是否直接有内存断点的调试方式... 期待高手...
然后再挂接一个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异常,这里反正有点复杂...
1,利用工具ollydbg、windbg似乎可以调试
2,利用软断点或者硬断点设置,看kiboisme 蓝色光芒的介绍,这个技术存在,但是还没有成熟方案,看来应用起来有点麻烦.
3,待其他总之,我是接手的一个程序,开发人员不在,要几个月之后才回来,目前只是修改些BUG的工作.
//不同的调用地方,传不同的AsourceFlag值
procedure SetXXXValue(A: XXX; AsourceFlag: integer=0);
begin
XXXX := A;
writelog(intotistr(AsourceFlag)); //记录哪里调用
end;