тестовые прогоны приложений, работающих в разных условиях, в частности в условиях активной
работы пользователя с продуктом (здесь 24/7 в течение всего периода испытаний работают
средства автоматического тестирования).
Поначалу программы время от времени "падают", от этого пока никуда не деться.
Наиболее простым (и результативным) способом отладки в таких случаях является использование
post-mortem отладчика, который активируется в системе (для WinXP это Dr.Watson,
для Windows 7 - подсистема Windows Error Reporting (WER) ).
Такой отладчик запускается в случае возникновения необработанного системного исключения, формирует
в файле протокола как можно более детальное описание проблемы, "посмертный дамп" приложения и,
если указано, куда-то его переслать.
Dr.Watson хорошо справляется с работой, но к нему имеется ряд серьезных претензий:
1) Файл с дампом только один, поэтому когда происходят два и более падения, следы остаются только от
последнего.
2) В файле протокола может храниться ограниченное число записей о проблемах с приложениями
(часть информации может быть потеряна).
3) Протокол Dr.Watson'a СЛИШКОМ подробный, при отладке 95% информации из него нам просто не нужны.
Тем не менее, ее постоянно приходится просматривать.
WER в Windows 7 тоже требует настройки (хотя там возможности намного богаче - при желании можно организовать
даже пересылку дампов на локальный отладочный сервер), да и, откровенно говоря, это первый релиз который официально явно поддерживает Win7 ;-)
С учетом изложенного выше для анализа проблем "в лоб" предлагается альтернативный подход, связанный со "сборкой" нужной ДЛЯ НАШИХ целей отладочной системы из готовых компонентов и ее высокоуровневой настройкой.
Отладочный комплект
Наш эрзац-отладчик состоит из следующих компонентов:
1) 3 файлов из состава пакета "Debugging Tools for Windows" (dbgeng, новый dbghelp, ntsd).
2) Настроечного сценария install.bat, который производит перерегистрацию "post-mortem" отладчика и
формирует привязанный к машине сценарий для обработки исключительных ситуаций.
3) Сценария uninstall.bat, который возвращает в качестве "post-mortem" отладчика Dr.Watson (для WinXP).
Точный файловый состав:
- dbgeng.dll
- dbghelp.dll
- install.bat
- ntsd.exe
- ntsd.ini
- uninstall.bat
Установка и порядок работы
1) Скопировать все файлы комплекта в какой-нибудь каталог на тестовой машине.
2) Запустить, находясь в этом каталоге, файл install.bat.
При возникновении проблем с приложениями в подкаталоге Dumps (относительно каталога,
куда скопированы файлы) формируется файл jit.log и файлы вида jit_02EC_2005-10-18_06-29-46-147_0438.dmp,
каждый из которых содержит информацию относительно одного "падения".
Время падения и первичная диагностика хранятся в файле jit.log. Там же хранится ссылка на
соответствующий исключительной ситуации файл дампа.
Примерный фрагмент файла протокола после запуска программы WriteZero.exe приводится ниже:
Client 00235860 mask is 1
-----------------------------------------------------------------------------------
Crash detected PID=1476 TID=1260 Process C:\Dumps\WriteZero.exe
Debugger (not debuggee) time: Tue Oct 18 06:24:50.902 2005 (GMT-7)
Stack trace:
# ChildEBP RetAddr
00 0012ffc0 77e9ca90 WriteZero+0x1000
01 0012fff0 00000000 KERNEL32!CreateProcessW+0x15a6
Raw stack:
0012ffc0 0012fff0
0012ffc4 77e9ca90 KERNEL32!CreateProcessW+0x15a6
0012ffc8 0012f77c
0012ffcc 77fcb227 ntdll!RtlAllocateHeap+0xaf
0012ffd0 7ffdf000
0012ffd4 c0000005
0012ffd8 0012ffc8
0012ffdc 0012fb34
0012ffe0 ffffffff
0012ffe4 77ea1856 KERNEL32!GetThreadContext+0x1c
0012ffe8 77e9ca98 KERNEL32!CreateProcessW+0x15ae
0012ffec 00000000
0012fff0 00000000
0012fff4 00000000
0012fff8 00401032 WriteZero+0x1032
0012fffc 00000000
00130000 000000c8
00130004 00000100
00130008 eeffeeff
0013000c 00000002
Modules imformation:start end module name
00400000 00408000 WriteZero C (no symbols)
77e80000 77f36000 KERNEL32 (export symbols) C:\WINNT\system32\KERNEL32.dll
77f80000 77ffb000 ntdll (export symbols) C:\WINNT\System32\ntdll.dll
Creating C:\Transas\IBS\DBG\Dumps\jit_0438_2005-10-18_06-24-50-912_05C4.dmp - mini user dump
Dump successfully written
quit:
Деинсталляция
1) Запустить файл uninstall.bat.
2) Уничтожить файлы отладочного комплекта и подкаталог Dumps.
Как это сделано "под капотом"
install.bat:
@echo off
set ORG=%~d0%~p0
set NTSDINI=%ORG%ntsd.ini
set DUMPDIR=%ORG%Dumps
if not exist "%DUMPDIR%" mkdir "%DUMPDIR%"
echo * Change to real symbol files location>"%NTSDINI%"
echo .sympath+ C:\Work\IBS_OUT\Release\Bin>>"%NTSDINI%"
echo .echo Fake!>>"%NTSDINI%"
echo .pcmd -c>>"%NTSDINI%"
echo .outmask- 0xffffffff>>"%NTSDINI%"
echo .logappend "%DUMPDIR%\jit.log">>"%NTSDINI%"
echo .outmask 0x1>>"%NTSDINI%"
echo .echo "-----------------------------------------------------------------------------------">>"%NTSDINI%"
echo .printf "Crash detected PID=%%d TID=%%d Process %%mu\n", $tpid, $tid, poi(poi($peb + 10) + 0n16*4 + 2*2)>>"%NTSDINI%"
echo .echotime>>"%NTSDINI%"
echo .printf "\nStack trace:\n">>"%NTSDINI%"
echo k n 8 >>"%NTSDINI%"
echo .printf "\nRaw stack:\n">>"%NTSDINI%"
echo kd>>"%NTSDINI%"
echo .printf "\nModules imformation:\n">>"%NTSDINI%"
echo lm>>"%NTSDINI%"
echo .dump /mFhutwd /u "%DUMPDIR%\jit.dmp">>"%NTSDINI%"
echo q>>"%NTSDINI%"
"%ORG%ntsd.exe" -iaec " -noio -cf \"%ORG%ntsd.ini\""
uninstall.cmd:
@echo off
drwtsn32 -I
Важное примечание: в сформированный сценарий можно вставлять свои команды, например,
направляющие уведомления о нештатной ситуации инженеру, ответственному за тестирование.
Традиционно для этой цели использовался установленный на машину blat, но это не есть догма - все зависит от конфигурации стенда и сети.
Для интеграции в сценарий можно использовать команду .shell.
Нестандартные команды
Чтобы не засорять вывод в протоколе использованы не очень распространенные команды:
.pcmd (Set Prompt Command)
.outmask (Control Output Mask)
BTW, слегка упрощенный архив можно в "один прием" загрузить отсюда.
Комментариев нет:
Отправить комментарий