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」スタイルのアクセス違反を見て、根本的な原因について何らかの考えを持っていることを願っています。
私の一番の疑いは、コードの他の領域によってフォームが「解放」されたこと、ウィンドウ メッセージが処理されていること、および TControl (実際のフォームの実際のコントロールの基本クラスとして) が単に失敗していることです。 Self が nil であるか、ウィンドウ ハンドルなどのリソースが無効であるためです。
Delphi デバッガーにアクセスせずにクライアントのコンピューターで実行できる、この問題の診断に役立つ手法を探しています。私が考えていたのは、いくつかのログを追加すること (しかし何?) や、クライアントのマシンで WinDbg (Windows SDK デバッガー ツール) を実行することです。