Креш-дампы (*.dmp)¶
- Table of contents
- Креш-дампы (*.dmp)
Речь идет о типовых креш-дампах, получаемых от наших заказчиков.
При аварийном завершении программы, входящие в ПО Digispot II, сохраняют дампы в каталог <где exe>\DMP, файл дампа имеет имя:
название.exe-дата_время.dmp, например, djin.exe-2010-12-02_10-31-37.dmp.
К сожалению, дампы не всегда записываются успешно. Дамп записан успешно только если рядом с файлом дампа есть одноименный *.ver файл. Если этого файла нет - то дамп непригоден для анализа. VER-файл программа записывает только после успешного формирования дампа. В нем хранится точная версия приложения, записавшего дамп, а также, кол-во ресурсов USER и GDI выделенное на момент креша. Эти числа помогают выявить креши, связанные с утечкой данных ресурсов.
Вот пример.
Пример содержимого *.ver файла
2.14.62
8 декабря 2009
110
GDI resources: 1242
USER resources: 586
Число в третьей строчке - это номер билда, оно появилось где-то в середине поколения 2.12.
Как посмотреть дамп¶
Приложения для просмотра дампов¶
Для того, чтобы получить максимум информации из дампа, его необходимо посмотреть его в среде разработки Microsoft Visual Studio или в отладчике WinDbg. Второй случай более сложный и не является типовым. Эта страничка относится к работе с Microsoft Visual Studio.
Дамп необходимо разворачивать в самой последней версии среды разработки, даже если версия ПО строилась более ранней версией студии. В настоящий момент необходимо использовать Microsoft Visual Studio 2013. Старую 2008 студию можно удалить с машин для просмотра дампов.
Отладочные символы системных файлов Windows¶
Отладочные символов системных библиотек должны быть загружены, иначе невозможна обратная трассировка стека и дам теряет все свою информативность.
Для загрузки системных символов необходимо настроить параметры среды.
Исходные тексты, бинарные файлы и отладочные символы
Необходимо найти архивы, созданные при сборке версии, включающий в себя исходные тексты и файлы отладочных символов (*.pdb).
Для текущих версий эти архивы можно найти тут
\SQL-SRVR\BIGSHARE\Builder
Нам нужен архив с совпадающим билдом (номер билда указывается в квадратных скобках), иначе исходные тексты нельзя будет посмотреть.
Восстановление путей к PDB¶
Чтобы отладчик нашел символы, необходимо воссоздать структура каталогов, совпадающую с той, в которой велось построение версии.
Проще всего ее посмотреть в файле build_path.txt, который находится рядом с архивами.
Необходимо восстановить данный путь.
- Создаем там папку С:\code
- Распаковываем содержимое архивов
- SRC.7z(rar) - в папку С:\code
- EXE.7z - в папку С:\code\exe
- PDB.7z - в папку С:\code\exe
- В архиве PDB.7z есть каталог PDB, содержимое этого каталога копируем в С:\code\exe
Возможно использовать подстановочный каталог:
Открытие дампа в отладчкике¶
- Копируем файл *.dmp в С:\code\exe
- Запускаем отладчик, варианты
- Даблклик на дамп файле
- запустить VS 2008. File - Open - Project/Solution - выбираем *.dmp файл
- F5 (Debug - Start debugging)
Контроль загрузки символов¶
Для корректного отображения стека вызовов требуется, чтобы версии некоторых общих библиотек совпадали с теми, которые были на машине, где произошел креш. Для чтобы понять, что все ОК, надо найти поток, в котором произошел креш. (Если дамп сняли с живого приложения, то нам нужен главный поток Main thread).
- Открываем окно Debug/Windows/Threads
- В списке колонок отображаем Suspended count (как в Джине, правой кнопкой по заголовку списка)
- Находим поток, у которого Suspended count = 0. Этих потоков д.б. 2. Если все потоки Suspended count=0, то берем главный поток (Main thread)
- Открываем окно Debug/Windows/Call stack
- В окне Threads выполняем двойной щелчок на выбранном потоке. После этого (может пройти значительное время на загрузку символов) в окне Call stack отображается стек вызова этого потока.
- Если выбирали поток с Suspended count = 0, то из двух потоков выбираем тот, в стеке вызовов которого присутствует что-то типа
> basic_m.dll!RunninigApp::WaitForEnd(int timeout_ms=600000) Cmn.dll!WriteDumpByStarter(DumpParams * params=0x00000000) Cmn.dll!WriteDumpAndContinue(bool suspend_threads=false, DumpParams * params=0x00000000) Cmn.dll!WriteDumpAndRestart(bool write_dump=true, RestartParams * restart_params=0x00000000, DumpParams * dump_params=0x00000000) Cmn.dll!LogExceptionWriteDumpAndRestart(_EXCEPTION_POINTERS * pointer=0x0012b580, bool write_dump=true, RestartParams * restart_params=0x00000000, DumpParams * dump_params=0x00000000) Cmn.dll!AppBaseTopLevelExceptionFilter(_EXCEPTION_POINTERS * pointer=0x0012b580)
- Просматриваем стек. И, начиная сверху, ищем первую строку типа
Frames below may be incorrect and/or missing, no symbols loaded for mfc100.dll
Нас интересуют библиотеки с именем типаmfc*.dll
илиmsvc*.dll
. - Открываем окно Debug\Windows\Modules
- Находим в нем строку с этой библиотекой и смотрим в колонку Version. Это требуемая версия библиотеки.
- Далее, нам нужно найти набор бибилиотек именно этой версии. Версию можно посмотреть в стандартном окне свойств файла.
Я складываю найденные в каталог \\SQL-SRVR\Symbols\одноименный каталог (типа mfc100.dll), в нем - каталог архитектуры x86, а в нем - каталоги с названиями - версиями. Там же есть "дефолтовый" каталог (Microsoft.VC100.MFC), в котором лежит "стандартная" версия файла.
Если нет ни там ни там - ищем такую библиотеку у себя в каталоге windows и, возможно, находим. Найденное копируем в \\SQL-SRVR\Symbols\ как описано выше. - Щелкаем правой кнопкой на строке
Frames below may be incorrect
и выбираем Load symbols from/Symbol path. Студия спросит про место расположения этого файла, и нужно выбрать найденный с нужной версией.
После этого содержимое стека изменится, а в строке в окне Modules в колонке Symbol file появится имя загруженного файла символов. - Повторяем, пока не загрузим все символы для
mfc*.dll
илиmsvc*.dll
Где смотреть¶
Для просмотра дампов есть виртуальная машина 192.168.0.72 (VBOX-WIN7)
user: maindomain\sql-remote-debug
password: userdebug
Архивы старых версий¶
Старые архивы имеют другую внутреннюю структуру, у них нет номера билда, но догадаться, что и как - можно.
Чтобы понять, какая версия в архиве, рекомендуется посмотреть содержимое запакованного файла DLLS\CMN\defs_ver.h
- \\GELEZYAKA\W\Fix_2_10\src_backups
- \\SQL-SRVR\F\fix_2_12_fix\src_backups
- \\SQL-SRVR\F\src_backups
- \\SQL-SRVR\BIGSHARE\Builder\OLD