Delphi 10.2最新版本2004,赢得x64 VCL应用程序。
尝试调试我的大型多线程应用程序我在奇怪的地方遇到了很多$ C00000005异常。 试图缩小问题的范围使我得到了这个最小的例子:创建一些(在我的情况下10个就足以看到问题)线程,使用&#34编译;使用debug .dcus"。
在第二个sleep
设置断点并多次按F9,直到异常被引发。
当它的凸起,汇编代码看起来坏了(看截图)。
RIP
指向正确指令的中间位置。
当我为Win32编译相同的测试应用程序时,它只是在几个F9之后挂在调试器中,所以我甚至无法制作错误截图。
更新
有关原始问题的更多信息让我开始寻找调试器问题: 我的生活应用程序(VCL win x64)有时会停止处理错误"问题导致程序无法正常工作" 。
每个线程都有异常日志记录系统,因此在失败后日志为空,我希望在调试器中运行它会给我一些有用的信息。
没有断点生活应用程序有时(非常罕见,大约每5小时一次)会抛出异常导致system.pas深入(查看最后一个屏幕)。 在这个屏幕上,最后一个System._USstrClr有nil指针。
当我在System._USstrClr中设置断点并多次点击F9时,完全相同的图片,它最终会出现nil指针。
我没有说这两个问题有相同的原因,只是想了解发生了什么。
从我看到的情况发生在仅在调试器中发生。
使用Release版本编译的life应用程序不会引发exeptions,它只是停止了"一个问题导致程序停止正常工作"正如我的用户报告的那样(以及没有任何错误信息的空日志)。
TMyThread = class (TThread)
procedure Execute; override;
end;
var
frmClientTest: TfrmClientTest;
ThreadList: TList<TMyThread>;
procedure TfrmClientTest.FormCreate(Sender: TObject);
var
k: integer;
begin
ThreadList:=TList<TMyThread>.Create;
for k:=0 to 10 do ThreadList.Add(TMyThread.Create);
end;
procedure TMyThread.Execute;
begin
FreeOnTerminate:=false;
repeat
sleep(100);
sleep(200);
until Terminated;
end;
=================
真正的应用例外: