Project

General

Profile

Креш-дампы (*.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, который находится рядом с архивами.

Необходимо восстановить данный путь.

  1. Создаем там папку С:\code
  2. Распаковываем содержимое архивов
    1. SRC.7z(rar) - в папку С:\code
    2. EXE.7z - в папку С:\code\exe
    3. PDB.7z - в папку С:\code\exe
      1. В архиве PDB.7z есть каталог PDB, содержимое этого каталога копируем в С:\code\exe

 

Возможно использовать подстановочный каталог:

Используя утилиту subst

Show

Открытие дампа в отладчкике

  1. Копируем файл *.dmp в С:\code\exe
  2. Запускаем отладчик, варианты
    1. Даблклик на дамп файле
    2. запустить VS 2008. File - Open - Project/Solution - выбираем *.dmp файл
  3. 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

  1. \\GELEZYAKA\W\Fix_2_10\src_backups
  2. \\SQL-SRVR\F\fix_2_12_fix\src_backups
  3. \\SQL-SRVR\F\src_backups
  4. \\SQL-SRVR\BIGSHARE\Builder\OLD

Add picture from clipboard (Maximum size: 742 MB)