procedure TMyReadThread.UpdateData;
begin
  Try
    Form1.Button14.Caption :=inttostr(Random(100));
  except //Try
  end;  //Try
end;procedure TMyReadThread.Execute;
var
test,tt:Dword;
begin
 While not self.Terminated do begin
    wupinend:=0;
    EnterCriticalSection(MyReadCs); //进入临界区
    ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
    LeaveCriticalSection(MyReadCs); //离开临界区
    Synchronize(UpdateData);
    Sleep(500);
 end;
end;
程序启动了3条线程,3条线程都和上面的代码类似,Execute读取/写入一些内容,然后UpdateData显示到程序主界面
Execute中读取/更新的全局变量内容有可能在程序的其他地方的任意时间被访问到
程序还连接到了mysql,与mysql通信的语句也全部加了try处理程序在执行过程中有可能会突然消失,退出,也没有错误提示框出现[我一般是在程序退出几分钟后才发现程序消失了]请问这样的情况,我该怎么才能找到出错的原因啊?

解决方案 »

  1.   

    用FastMM看看有没有内存泻漏,还没解决就在可疑的地方写日志吧,这种事太麻烦了
      

  2.   

    ReadProcessMemory 
    应该是这里,但不知道你具体的应用.
    wupinend 这个全局,就放到临界区吧.  但没看出这个的作用.
      

  3.   

    有些超出Ring3级的异常是我们捕获不到的,需要用另外的方法。ReadProcessMemory你调用这个函数主要用途是什么?
      

  4.   

    我去找找FastMM是什么wupinend这个是全局变量,放错地方了改成了这样
        EnterCriticalSection(MyReadCs); //进入临界区
        wupinend:=0;
        ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
        LeaveCriticalSection(MyReadCs); //离开临界区
    ReadProcessMemory是读取其他进程的内存
      

  5.   

    在Delphi7里使用FastMM遇到了点问题啊
      

  6.   

    如果你放对了的话;  最上面应该是 program 而不是unit 什么的...放在工程的第一个uses 中,而不是单元
      

  7.   

    http://download.csdn.net/source/1469205
      

  8.   

    那个的确是要放在program文件里的~不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试
      

  9.   

    临界区去掉问题依旧
    不知道是不是该考虑dbexpress连接mysql的问题了。
      

  10.   

    我用Delphi7+FastMM直接调试程序3天了也没跳出异常
    找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
    好像不能在一台机器上启动多个Delphi调试吧出现了问题也找无法判断问题出在哪啊