我有一个 delphi 2007 应用程序,它在标准 VCL 单元 Controls.pas 的 TControl.Perform 方法中存在周期性访问冲突。调用堆栈如下所示:
exception message : Access violation at address 00000000. Read of address 00000000.
Main ($1cac):
00000000 +000 ???
004cd644 +024 mainexe.exe Controls 5021 +5 TControl.Perform
004ce705 +015 mainexe.exe Controls 5542 +2 TControl.CMMouseEnter
004cd9b7 +2bb mainexe.exe Controls 5146 +83 TControl.WndProc
004d19bb +4fb mainexe.exe Controls 7304 +111 TWinControl.WndProc
004a8ff8 +06c mainexe.exe StdCtrls 3684 +13 TButtonControl.WndProc
004cd644 +024 mainexe.exe Controls 5021 +5 TControl.Perform
004d182b +36b mainexe.exe Controls 7255 +62 TWinControl.WndProc
004a8ff8 +06c mainexe.exe StdCtrls 3684 +13 TButtonControl.WndProc
004d10e4 +02c mainexe.exe Controls 7073 +3 TWinControl.MainWndProc
0048af08 +014 mainexe.exe Classes 11583 +8 StdWndProc
75ce7bc5 +00a USER32.dll DispatchMessageA
004ecaf4 +0fc mainexe.exe Forms 8105 +23 TApplication.ProcessMessage
004ecb2e +00a mainexe.exe Forms 8124 +1 TApplication.HandleMessage
004ece23 +0b3 mainexe.exe Forms 8223 +20 TApplication.Run
0136cac7 +383 mainexe.exe mainexe 326 +45 initialization
75563398 +010 kernel32.dll BaseThreadInitThunk
我无法在办公室复制它,所以我只能通过 MadExcept 直接从客户那里获得调用堆栈。
我不确定如何诊断或以其他方式确定原因,然后纠正以这种方式发生的故障。我希望有人已经看到了这种“TControl.Perform”风格的访问冲突,并对根本原因有所了解。
我的#1怀疑是我的代码的其他一些区域已经“释放”了一个表单,并且正在处理一个窗口消息,并且 TControl (作为某种真实形式的某些真实控件的基类)只是失败了因为 Self 是 nil,或者像窗口句柄这样的资源是无效的。
我正在寻找一种可以帮助我诊断此问题的技术,该技术可以在客户端计算机上执行,而无需访问 delphi 调试器。我的想法包括添加一些日志记录(但什么?),甚至在客户端机器上运行 WinDbg(Windows SDK 调试器工具)。