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 这个全局,就放到临界区吧. 但没看出这个的作用.
应该是这里,但不知道你具体的应用.
wupinend 这个全局,就放到临界区吧. 但没看出这个的作用.
#3
有些超出Ring3级的异常是我们捕获不到的,需要用另外的方法。ReadProcessMemory你调用这个函数主要用途是什么?
#4
我去找找FastMM是什么
wupinend这个是全局变量,放错地方了。。。改成了这样
EnterCriticalSection(MyReadCs); //进入临界区
wupinend:=0;
ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
LeaveCriticalSection(MyReadCs); //离开临界区
ReadProcessMemory是读取其他进程的内存
wupinend这个是全局变量,放错地方了。。。改成了这样
EnterCriticalSection(MyReadCs); //进入临界区
wupinend:=0;
ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
LeaveCriticalSection(MyReadCs); //离开临界区
ReadProcessMemory是读取其他进程的内存
#5
在Delphi7里使用FastMM遇到了点问题啊。。。
#6
如果你放对了的话; 最上面应该是 program 而不是unit 什么的...
放在工程的第一个uses 中,而不是单元
放在工程的第一个uses 中,而不是单元
#7
有难度 。。。
#8
是不是问题出在临界区的使用上,如果把临界去掉试试(先不管结果是否正确)
#9
对,你是不是放错了。
#10
放在工程文件的最上面,不是单元
#12
反复调试吧
#13
那个的确是要放在program文件里的~
不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试
不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试
#14
临界区去掉问题依旧。。。
不知道是不是该考虑dbexpress连接mysql的问题了。。。。
不知道是不是该考虑dbexpress连接mysql的问题了。。。。
#15
我用Delphi7+FastMM直接调试程序3天了也没跳出异常
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。
#1
用FastMM看看有没有内存泻漏,还没解决就在可疑的地方写日志吧,这种事太麻烦了
#2
ReadProcessMemory
应该是这里,但不知道你具体的应用.
wupinend 这个全局,就放到临界区吧. 但没看出这个的作用.
应该是这里,但不知道你具体的应用.
wupinend 这个全局,就放到临界区吧. 但没看出这个的作用.
#3
有些超出Ring3级的异常是我们捕获不到的,需要用另外的方法。ReadProcessMemory你调用这个函数主要用途是什么?
#4
我去找找FastMM是什么
wupinend这个是全局变量,放错地方了。。。改成了这样
EnterCriticalSection(MyReadCs); //进入临界区
wupinend:=0;
ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
LeaveCriticalSection(MyReadCs); //离开临界区
ReadProcessMemory是读取其他进程的内存
wupinend这个是全局变量,放错地方了。。。改成了这样
EnterCriticalSection(MyReadCs); //进入临界区
wupinend:=0;
ReadProcessMemory (hProcess, Pointer(test+$10), @MyTTA, 4, tt);
LeaveCriticalSection(MyReadCs); //离开临界区
ReadProcessMemory是读取其他进程的内存
#5
在Delphi7里使用FastMM遇到了点问题啊。。。
#6
如果你放对了的话; 最上面应该是 program 而不是unit 什么的...
放在工程的第一个uses 中,而不是单元
放在工程的第一个uses 中,而不是单元
#7
有难度 。。。
#8
是不是问题出在临界区的使用上,如果把临界去掉试试(先不管结果是否正确)
#9
对,你是不是放错了。
#10
放在工程文件的最上面,不是单元
#11
#12
反复调试吧
#13
那个的确是要放在program文件里的~
不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试
不过使用了FastMM也没有解决问题,接下来把线程里的临界区去掉试试
#14
临界区去掉问题依旧。。。
不知道是不是该考虑dbexpress连接mysql的问题了。。。。
不知道是不是该考虑dbexpress连接mysql的问题了。。。。
#15
我用Delphi7+FastMM直接调试程序3天了也没跳出异常
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。
找另外3台机器,每台机器开10个程序,跑一段时间就可能会有某个程序出现如下的对话框
好像不能在一台机器上启动多个Delphi调试吧。。。出现了问题也找无法判断问题出在哪啊。。。