私はDelphi2007でアプリケーションを作成しましたが、これは時々ハングします(毎週ではなく、アプリケーションは24時間年中無休で実行されています)。メインスレッドが動かなくなったようです。この問題の原因を特定するためのオプションは何ですか?
アプリケーションはDelphi2007で記述されており、RemObjects、Firebirdを使用したDBExpress、COMを使用したOPC通信を使用します。
私はDelphi2007でアプリケーションを作成しましたが、これは時々ハングします(毎週ではなく、アプリケーションは24時間年中無休で実行されています)。メインスレッドが動かなくなったようです。この問題の原因を特定するためのオプションは何ですか?
アプリケーションはDelphi2007で記述されており、RemObjects、Firebirdを使用したDBExpress、COMを使用したOPC通信を使用します。
MadExceptを使用すると、メインスレッドが定期的にチェックされてメッセージを処理するように指定できます(タイムアウトは可変で、最長のアクションよりも高い値に設定します)。メインスレッドがハングした場合は、スタックトレースを取得できます。
メインスレッドのフリーズチェックを参照してください...
私はこれをある程度成功させて使用しましたが、ハングがドライバーにある場合にのみ失敗しました(これはおそらく予想されることです)。(A / D変換カードの)ドライバーを疑うようになった後、各API呼び出しの前後にトレースメッセージを追加し、ドライバーが原因であることを証明することができました。信頼できるログデータを取得するには、すぐにメッセージをファイルに書き込み、バッファをフラッシュすることが重要であることに注意してください。
また、 WinDbgを使用して、Delphiがインストールされていないシステムでハングしている実行可能ファイルに接続することに成功しました。これは、クリティカルセクションを常に同じ順序で取得するとは限らないことによるデッドロックであることが判明しました。WinDbgは、スレッドスタックとクリティカルセクションの状態を調べることにより、このような状況を分析するのに役立ちます。
これには「ウォッチドッグ」スレッドを使用して、メインフォームが応答しているかどうかを確認し、ミニダンプを作成します(このダンプは、WinDbgでロードでき、map2dbg.exeを使用してDelphi .mapを.dbgに変換できます)。
FMainformHandle := Application.MainForm.Handle;
Result := SendMessageTimeOut( FMainformHandle, WM_NULL, 0, 0,
SMTO_NORMAL or SMTO_ABORTIFHUNG,
C_TIME_OUT_SECONDS * 1000, //wait 1minute
iRes) <> 0;
if not Result then
begin
hFile := CreateFile(PChar(Result), GENERIC_WRITE, FILE_SHARE_WRITE, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
try
MiniDumpWriteDump(GetCurrentProcess, GetCurrentProcessId, hFile,
aDumpType, nil, nil ,nil);
finally
FileClose(hfile);
end;
end;
しかし、あなたも使用することができます
jclDebug.pas:
JclCreateThreadStackTraceFromID(MainthreadId)
このため(WinDbgなどは不要、JCL + Delphi .mapのみ)
3番目のオプションは、「プロセススタックビューア」を備えた新しいサンプリングプロファイラーを使用することです。これにより、実行中のプロセスの任意のスレッドのスタックを監視できます(以前はSysInternals Process Explorerを使用していましたが、.dbgファイルが必要です)。スタックトレースに.map、TD32、JDBGなど(任意のDelphiデバッグ情報)を使用します。
アプリがハングしたときにこれを使用して、スタックを調査できます。
Windows API(MiniDumpWriteDump用):
http
://sourceforge.net/projects/jedi-apilib/files/JEDI%20Windows%20API/
WinDbg: http:
//www.microsoft.com/whdc/devtools/debugging/installx86.Mspx
Map2Dbg:
http
://code.google.com/p/map2dbg/
JEDI JCL:
http://jcl.delphi-jedi.org/
AsmProfiler、サンプリングモード:(まだ開発中です!)
http://asmprofiler.googlecode。 com / files / AsmSamplingProfiler0.4.zip