В первой статье по докладу «Дамп – не приговор, а повод задуматься», с которым выступили на конференции INFOSTART TECH EVENT 2024, рассказали, как включать сбор файлов дампов для операционных систем Linux и Windows. Теперь давайте рассмотрим, какую информацию содержат файлы дампа, чем она полезна и как ее анализировать.
Итак, в файле дампа содержится полный или частичный снимок виртуальной памяти процесса. Если посмотреть в Диспетчер задач, будет видно, что все процессы используют немаленький объем оперативной памяти для решения своих задач, будь то вычисления, работа с данными, прочитанными с диска, кэши и многое другое. Все, что они хранит в виртуальной памяти, выгружается в дамп, создаваемый при аварийном завершении процессов.
В этом файле можно найти много полезной информации, рассмотрим их подробнее.
Стек вызовов – это указание на место в коде, где возникла ошибка, в результате которой произошло аварийное завершение процесса. Также здесь можно просмотреть:
- значения локальных переменных, которые были объявлены в функциях в стеке
- значения входных аргументов этих функций
- указатели на возврат, то есть, куда нужно было вернуть управление после того, как функция завершит свою работу
Загруженные модули – это компоненты, библиотеки и другие и исполняемые файлы, которые были загружены в память процесса во время выполнения программы. Например, при взаимодействии с web-сервером или с СУБД.
Куча – здесь хранятся все объекты, для которых была выделена память. Например, это могло быть сделано функцией malloc – аллокация памяти. Это долгосрочное хранилище данных, которые не удаляются при завершении работы функции. Чтобы их удалить, нужно явно освободить память в коде приложения.
На практике можно получить два вида дампа – полный дамп и мини-дамп.
Полный дамп содержит весь снимок виртуальной памяти процесса. То есть, размер файла дампа будет соответствовать размеру памяти, занимаемой процессом, в момент аварийного завершения этого процесса.
Мини-дамп содержит только те данные, которые использовались в момент аварийного завершения, например, те данные в «куче», на которые ссылались переменные в стеке вызовов. При этом размер файла дампа может составлять всего несколько мегабайт.
Как анализировать файлы дампа?
В первую очередь, анализ начинаем с имени файла дампа. В этом имени содержится много полезной информации: имя процесса, версия платформы 1С, смещение, дата формирования, PID процесса. Для начала стоит обратить внимание на такое понятие как «смещение», которое бывает нулевым и ненулевым.
Нулевое смещение, как на примере выше, означает, что дамп сформирован не в результате аварийного завершения, и информации об исключении в нем нет. Причина его появления – система мониторинга кластера, которая признала процесс аварийным, завершила его и сняла с него дамп. По большому счету, пользы от такого дампа для наших нужд почти нет, он наиболее полезен вендору.
Если же файл дампа имеет ненулевое смещение – это говорит об аварийной ситуации, и в этом файле уже будет содержаться стек исключения. В случае, если появление дампов с одинаковым смещением происходит с определенной периодичностью, можно предположить, что причиной является одна и та же ошибка.
Если посмотреть на пример имени файла дампа, сформированного в ОС Linux (на изображении выше), можно увидеть, что там содержится похожая информация, что и в имени файла в ОС Windows, за исключением смещения.
В Linux дамп снимается самой операционной системой, смещение как таковое есть, но в содержимом файла. Чтобы заглянуть в содержимое файла, можно использовать различные утилиты:
- для ОС Windows: Windbg, Visual Studio
- для ОС Linux: GDB, Журнал событий ОС
Важно учитывать, что детально проанализировать содержимое файла дампа может только вендор – в данном случае фирма «1С». Именно разработчик приложения имеет в своем распоряжении исходный код программы и отладочные символы, позволяющие «перевести» содержимое дампа, например, стек, в понятные для человека имена функций и процедур.
Как анализировать файл дампа через Windbg
В качестве примера рассмотрим анализ файла дампа в ОС Windows при помощи утилиты Windbg.
При открытии дампа программа сразу предложит выполнить команду «!analyze –v», которая проанализирует содержимое файла и попытается вывести самую полезную информацию для того, чтобы понять причину возникновения этого дампа.
На изображении ниже можно увидеть, о каких данных идет речь:
- Тип исключения: тип и код исключения, например, нарушение доступа (Access Violation), т.е. ошибка сегментации памяти в ОС Windows
- Модуль и функция исключения: имя модуля (например, backend.dll) и функции, в которой произошла ошибка, послужившая причиной аварийного завершения процесса
- Трассировка стека: список вызовов функций, ведущих к исключению
- Идентификация процесса и потока: имя процесса и номер потока, вызвавшего исключение
- Адрес исключения: смещение – адрес в памяти, где произошло исключение
Дополнительно в этой же утилите можно выполнить команду «lmv», которая покажет библиотеки, загруженные в процесс. Здесь же по каждой библиотеке отображается информация об авторе библиотеки и ее версии.
Важно знать, что id треда в дампе можно сопоставить с OSThread – свойством, которое есть во многих событиях ТЖ. Это иногда очень упрощает анализ – можно посмотреть по ТЖ, что делал проблемный поток.
Внимание на пример ниже, где мы видим контекст исключения: сначала указан идентификатор процесса, затем – идентификатор потока, в котором оно возникло.
<pid в шестнадцатеричной системе>.<ID треда в шестнадцатеричной системе>
ID треда в десятичной системе = OSThread в технологическом журнале 1С
25:40.578000-44000,CALL,2, process=rphost,…, OSThread=2543312,…, Usr=admin, SessionID=10, Context=Система.ПолучитьФорму : ВнешняяОбработка.УронитьСервер
Также после выполнения команды «!analyze –v» в свойствах STACK_COMMAND будет отображен символ тильды («~») и номер потока, в котором возникло исключение. Выполнив еще одну команду «~*kb», можно увидеть все активные потоки внутри дампа. Для каждого из них также можно получить номер треда и сопоставить с технологическим журналом.
* * *
Итак, мы выяснили, как включать сбор файлов дампов для ОС Linux и Windows, а также обсудили, что в себе содержат файлы дампа и как анализировать эту информацию. В следующей части поговорим о rphost – важнейшем звене архитектуры платформы «1С:Предприятие 8».