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

解决方案 »

  1.   

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

  2.   

    写成这样的 property Name:  read GetName write SetName;
    就可以在setname中打断点了,运行到断点后点击delphi的菜单view->debug windows-call stack,就可以知道了。
      

  3.   

    回:okmnjizc:
    你说的第一点,我早就想到了,只是程序太大,需要设断点的地方有几万处,程序过程函数单元又是交叉引用的,所以这个办法最有效,但是却最难实行.
    第二点,Ollydbg是个什么工具没用过,能否介绍详细一点.回xiaojun5556:
    你说的办法也很好,至少可以解决很多问题,不过我现在的任务不是程序设计,而是程序分析,程序已经成形,不方便再改.
      

  4.   

    回:okmnjizc:
    如果有什么办法直接监视内存,再能自动在其值变化的时候,产生断点,就好了.
      

  5.   

    一些调试工具如ollydbg、windbg等能断,但是得先找到全局变量的内存位置,而且断下来是汇编...
    不知D里是否直接有内存断点的调试方式... 期待高手...
      

  6.   

    挂接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异常,这里反正有点复杂...
      

  7.   

    看过回帖后,我这么理解
    1,利用工具ollydbg、windbg似乎可以调试
    2,利用软断点或者硬断点设置,看kiboisme 蓝色光芒的介绍,这个技术存在,但是还没有成熟方案,看来应用起来有点麻烦.
    3,待其他总之,我是接手的一个程序,开发人员不在,要几个月之后才回来,目前只是修改些BUG的工作.
      

  8.   

    用个全局函数来赋值, 有些变量类型如果是多线程访问需要考虑线程安全
    //不同的调用地方,传不同的AsourceFlag值
    procedure SetXXXValue(A: XXX; AsourceFlag: integer=0);
    begin
      XXXX := A;
      writelog(intotistr(AsourceFlag));  //记录哪里调用
    end;