среда, 26 января 2011 г.

Мини-Ватсон

В силу специфики продуктов Transas'a мы устраиваем перед выпуском продуктов массированные
тестовые прогоны приложений, работающих в разных условиях, в частности в условиях активной
работы пользователя с продуктом (здесь 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, слегка упрощенный архив можно в "один прием" загрузить отсюда.

Комментариев нет: