Для этого я использовал поток «watchdog», который проверяет, отвечает ли основная форма, и создает мини-дамп (вы можете загрузить этот дамп с помощью 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