怎么才能知道程序异常退出的原因?

时间:2022-09-18 22:49:34
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处理

程序在执行过程中有可能会突然消失,退出,也没有错误提示框出现[我一般是在程序退出几分钟后才发现程序消失了]

请问这样的情况,我该怎么才能找到出错的原因啊?

15 个解决方案

#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


有难度  。。。

#8


是不是问题出在临界区的使用上,如果把临界去掉试试(先不管结果是否正确)

#9


引用 6 楼 starluck 的回复:
如果你放对了的话; 最上面应该是 program 而不是unit 什么的...

放在工程的第一个uses 中,而不是单元

对,你是不是放错了。

#10


放在工程文件的最上面,不是单元

#12


反复调试吧

#13


那个的确是要放在program文件里的~

不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试

#14


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

#15


我用Delphi7+FastMM直接调试程序3天了也没跳出异常
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
怎么才能知道程序异常退出的原因?

好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。

#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


有难度  。。。

#8


是不是问题出在临界区的使用上,如果把临界去掉试试(先不管结果是否正确)

#9


引用 6 楼 starluck 的回复:
如果你放对了的话; 最上面应该是 program 而不是unit 什么的...

放在工程的第一个uses 中,而不是单元

对,你是不是放错了。

#10


放在工程文件的最上面,不是单元

#11


#12


反复调试吧

#13


那个的确是要放在program文件里的~

不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试

#14


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

#15


我用Delphi7+FastMM直接调试程序3天了也没跳出异常
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
怎么才能知道程序异常退出的原因?

好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。