В вычислительной технике дамп ядра , дамп памяти , аварийный дамп , дамп хранилища , системный дамп или дамп ABEND [1] состоит из записанного состояния рабочей памяти компьютерной программы в определенное время, как правило, когда программа аварийно завершилась или иным образом завершилась ненормально. [2] На практике другие ключевые части состояния программы обычно сбрасываются в то же время, включая регистры процессора , которые могут включать счетчик программ и указатель стека , информацию об управлении памятью и другие флаги и информацию процессора и операционной системы. Дамп снимка (или дамп снимка ) — это дамп памяти, запрошенный оператором компьютера или запущенной программой, после которого программа может продолжить работу. Дампы ядра часто используются для помощи в диагностике и отладке ошибок в компьютерных программах.
Во многих операционных системах фатальное исключение в программе автоматически запускает дамп ядра. В более широком смысле фраза «сбросить ядро» стала во многих случаях означать любую фатальную ошибку, независимо от того, существует ли запись памяти программы. Термин «дамп ядра», «дамп памяти» или просто «дамп» также стал жаргоном для обозначения любого вывода большого количества необработанных данных для дальнейшего изучения или других целей. [3] [4]
Название происходит от памяти на магнитных сердечниках [5], основной формы памяти с произвольным доступом с 1950-х по 1970-е годы. Название сохранилось еще долго после того, как технология магнитных сердечников устарела.
Самые ранние дампы памяти представляли собой бумажные распечатки [6] содержимого памяти, обычно организованного в столбцы восьмеричных или шестнадцатеричных чисел (« шестнадцатеричный дамп »), иногда сопровождавшиеся их интерпретацией в виде инструкций машинного языка , текстовых строк, десятичных чисел или чисел с плавающей точкой ( ср. дизассемблер ).
По мере увеличения объемов памяти и разработки утилит для анализа данных после смерти дампы записывались на магнитные носители, такие как лента или диск.
Вместо того, чтобы отображать только содержимое соответствующей памяти, современные операционные системы обычно генерируют файл, содержащий образ памяти, принадлежащей аварийному процессу, или образы памяти частей адресного пространства, связанных с этим процессом, вместе с другой информацией, такой как значения регистров процессора, счетчика программ, системных флагов и другой информацией, полезной для определения первопричины аварии. Эти файлы можно просматривать как текст, печатать или анализировать с помощью специализированных инструментов, таких как elfdump в Unix и Unix-подобных системах, objdump и kdump в Linux , IPCS (Interactive Problem Control System) в IBM z/OS , [7] DVF (Dump Viewing Facility) в IBM z/VM , [8] WinDbg в Microsoft Windows, Valgrind или других отладчиков.
В некоторых операционных системах [b] приложение или оператор могут запросить снимок выбранных блоков хранилища, а не всего хранилища, используемого приложением или операционной системой.
Дампы ядра могут служить полезными отладочными средствами в нескольких ситуациях. На ранних автономных или пакетных системах дампы ядра позволяли пользователю отлаживать программу, не монополизируя (очень дорогую) вычислительную мощность для отладки; распечатка также могла быть более удобной, чем отладка с использованием переключателей и индикаторов на передней панели .
На общедоступных компьютерах, будь то системы с разделением времени, пакетной обработкой или серверные системы, дампы ядра позволяют выполнять автономную отладку операционной системы , чтобы система могла немедленно возобновить работу.
Дампы ядра позволяют пользователю сохранять сбой для последующего или внешнего анализа или сравнения с другими сбоями. Для встраиваемых компьютеров может быть непрактично поддерживать отладку на самом компьютере, поэтому анализ дампа может происходить на другом компьютере. Некоторые операционные системы, такие как ранние версии Unix, не поддерживали присоединение отладчиков к запущенным процессам, поэтому дампы ядра были необходимы для запуска отладчика на содержимом памяти процесса.
Дампы ядра могут использоваться для захвата данных, освобожденных во время динамического выделения памяти , и, таким образом, могут использоваться для извлечения информации из программы, которая больше не выполняется. При отсутствии интерактивного отладчика дамп ядра может использоваться усердным программистом для определения ошибки путем прямого исследования.
Иногда моментальные дампы являются удобным способом для приложений быстро записывать грубые отладочные данные.
Дамп ядра обычно представляет собой полное содержимое сброшенных областей адресного пространства сброшенного процесса. В зависимости от операционной системы дамп может содержать мало или вообще не содержать структур данных, помогающих интерпретировать области памяти. В этих системах для успешной интерпретации требуется, чтобы программа или пользователь, пытающиеся интерпретировать дамп, понимали структуру использования памяти программой.
Отладчик может использовать таблицу символов , если она существует, чтобы помочь программисту интерпретировать дампы, идентифицируя переменные символически и отображая исходный код; если таблица символов недоступна, возможна меньшая интерпретация дампа, но все еще может быть достаточно возможной для определения причины проблемы. Существуют также специальные инструменты, называемые анализаторами дампов, для анализа дампов. Одним из популярных инструментов, доступных во многих операционных системах, является objdump из GNU binutils .
В современных Unix-подобных операционных системах администраторы и программисты могут читать файлы дампа ядра, используя библиотеку GNU Binutils Binary File Descriptor (BFD), а также GNU Debugger (gdb) и objdump, которые используют эту библиотеку. Эта библиотека будет поставлять необработанные данные для заданного адреса в области памяти из дампа ядра; она ничего не знает о переменных или структурах данных в этой области памяти, поэтому приложение, использующее библиотеку для чтения дампа ядра, должно будет определить адреса переменных и определить макет структур данных самостоятельно, например, используя таблицу символов для отлаживаемой программы.
Аналитики аварийных дампов систем Linux могут использовать kdump или Linux Kernel Crash Dump (LKCD). [9]
Дампы ядра могут сохранять контекст (состояние) процесса в заданном состоянии для возврата к нему позже. Системы могут быть сделаны высокодоступными путем передачи ядра между процессорами, иногда через сами файлы дампа ядра.
Ядро также может быть сброшено на удаленный хост по сети (что представляет собой риск безопасности). [10]
Пользователи мэйнфреймов IBM под управлением z/OS могут просматривать дампы SVC и транзакций с помощью интерактивной системы управления проблемами (IPCS), полноэкранного средства чтения дампов, которое изначально было представлено в OS/VS2 (MVS) , поддерживает написанные пользователем скрипты в REXX и позволяет просматривать дампы по принципу «наведи и снимай» [c] .
В старых и более простых операционных системах каждый процесс имел непрерывное адресное пространство, поэтому файл дампа иногда был просто файлом с последовательностью байтов, цифр, символов [d] [d] или слов. На других ранних машинах файл дампа содержал дискретные записи, каждая из которых содержала адрес хранения и связанное с ним содержимое. На ранних машинах дамп часто записывался автономной программой дампа, а не приложением или операционной системой.
Монитор IBSYS для IBM 7090 включал программу дампа памяти ядра системы [11] , которая поддерживала дампы post-motem и snap.
На IBM System/360 стандартные операционные системы записывали форматированные дампы ABEND и SNAP с адресами, регистрами, содержимым хранилища и т. д., преобразованными в печатные формы. В более поздних версиях была добавлена возможность записывать неформатированные [e] дампы, которые в то время назывались дампами образа ядра (также известными как дампы SVC).
В современных операционных системах адресное пространство процесса может содержать пробелы и может совместно использовать страницы с другими процессами или файлами, поэтому используются более сложные представления; они также могут включать в себя другую информацию о состоянии программы на момент дампа.
В Unix-подобных системах дампы ядра обычно используют стандартный формат исполняемого образа :
SYSABEND
и SYSUDUMP
для форматированного дампа ABEND и произвольным ddnames для дампов SNAP или определять эти ddnames как SYSOUT. [f]SYS1.DUMP
[i] на момент сбоя, а также консольный дамп, запрошенный оператором.coreadm
позволяет настраивать имя и расположение основных файлов.core
. В Linux (начиная с версий 2.4.21 и 2.6 основной ветки ядра Linux ) можно указать другое имя через procfs с помощью /proc/sys/kernel/core_pattern
файла конфигурации; указанное имя также может быть шаблоном, содержащим теги, заменяемые, например, именем исполняемого файла, идентификатором процесса или причиной дампа. [16]vmcore
или vmcore.incomplete
..dmp
; например, дампы ядра могут иметь имена memory.dmp
или \Minidump\Mini051509-01.dmp
.Microsoft Windows поддерживает два формата дампа памяти, описанные ниже.
Существует пять типов дампов режима ядра: [17]
Для анализа дампов режима ядра Windows используются Debugging Tools for Windows . [19]
Дамп памяти пользовательского режима, также известный как минидамп , [20] — это дамп памяти одного процесса. Он содержит выбранные записи данных: полную или частичную (отфильтрованную) память процесса; список потоков с их стеками вызовов и состоянием (например, регистры или TEB ); информацию о дескрипторах объектов ядра; список загруженных и выгруженных библиотек . Полный список опций, доступных в MINIDUMP_TYPE
enum. [21]
Программа NASA Voyager, вероятно, была первым аппаратом, который регулярно использовал функцию дампа ядра в сегменте Deep Space. Функция дампа ядра является обязательной функцией телеметрии для сегмента Deep Space, поскольку было доказано, что она минимизирует затраты на диагностику системы. [ необходима цитата ] Аппарат Voyager использует регулярные дампы ядра для обнаружения повреждений памяти из-за событий, связанных с космическими лучами .
Системы дампа ядра космической миссии в основном основаны на существующих наборах инструментов для целевого ЦП или подсистемы. Однако в течение миссии подсистема дампа ядра может быть существенно изменена или улучшена для конкретных нужд миссии.
До появления kdump, Linux Kernel Crash Dump (LKCD) был популярным механизмом для получения и анализа дампов.
Службы удаленного дампа памяти, такие как netdump
, передают содержимое памяти по сети в незашифрованном виде.
ACTIVE, MAIN или STORAGE указывает центральное хранилище для адресного пространства, в котором в данный момент работает IPCS, и позволяет получить доступ к этому активному хранилищу как к источнику дампа. Вы можете получить доступ к частному хранилищу и любому общему хранилищу, доступному неавторизованной программе.
SYS1.DUMPnn
(nn от 00 до 99). z/OS поддерживает несколько наборов данных системного дампа с произвольными шаблонами dsname при установке и под контролем оператора [12] .Описания формата файла
Дампы ядра: