Zrzut pamięci

Zrzut rdzenia (w żargonie uniksowym), zrzut pamięci lub zrzut systemu[1] – zapisany stan pamięci roboczej programu komputerowego w danym czasie, zazwyczaj w chwili gdy program uległ awarii lub zakończył pracę w nieoczekiwany sposób[2].

W praktyce inne kluczowe elementy stanu programu zwykle są „zrzucane” w tym samym czasie, np. rejestry procesora, które mogą zawierać licznik programu, wskaźnik stosu, informacje odnośnie do zarządzania pamięcią i inne dane dotyczące procesora i flag systemu operacyjnego. Tak wykonane zrzuty pamięci wykorzystuje się w diagnozowaniu i usuwaniu błędów w programach komputerowych.

Nazwa pochodzi od pamięci ferrytowej[3], która była głównym typem pamięci o dostępie swobodnym w okresie od lat 50. do lat 70. Nazwa ta pozostała na długo po tym, jak technologia rdzeni magnetycznych przestała być używana.

W wielu systemach operacyjnych krytyczny błąd programu automatycznie generuje zrzut pamięci; określenie zrzut rdzenia, zrzut pamięci lub po prostu zrzut funkcjonował w żargonie jako pojęcie odnoszące się do dowolnego magazynowania dużej ilości surowych danych w celu dalszej analizy lub innych celów[4][5].

Historia

Przed nadejściem systemów operacyjnych z rodziny DOS i możliwości zapisywania plików z dużą ilością danych, zrzuty rdzenia miały formę papierowych wydruków[6] zawartości pamięci, zwykle składających się z kolumn liczb zapisanych w systemie ósemkowym bądź szesnastkowym (tzw. „hex dump”). Czasami zawierały one także interpretację w postaci instrukcji w języku maszynowym, ciągi znaków oraz liczb stałych lub zmiennoprzecinkowych (por. deasembler).

Zamiast samego wyświetlania zawartości stosowanej pamięci, współczesne systemy operacyjne zwykle generują plik zawierający obraz pamięci należącej do przerwanego procesu, lub obrazy pamięci części przestrzeni adresowej związanej z tym procesem, a także inne informacje, takie jak wartości rejestrów procesora, licznik programu, flagi systemu oraz inne informacje przydatne w określaniu przyczyny błędu. Pliki te mogą być wyświetlane w formie tekstowej, w formie wydruku, lub też mogą zostać poddane analizie za pomocą odpowiednich narzędzi takich jak elfdump w Uniksie oraz systemach uniksopodobnych, objdump oraz kdump w systemie Linux, WinDbg w systemie Microsoft Windows, Valgrind, oraz innych debugerów.

Obecne pliki zrzutu pamięci i komunikaty o błędach zazwyczaj są kodowane w systemie szesnastkowym, ponieważ reprezentacje dziesiętne i ósemkowe są mniej użyteczne dla programisty.

Zastosowanie

Zrzuty pamięci mogą służyć jako użyteczne narzędzia do debugowania w niektórych sytuacjach. We wczesnych systemach autonomicznych lub trybu wsadowego, zrzuty pamięci pozwoliły użytkownikowi na debugowanie programu bez konieczności monopolizacji (bardzo drogich) urządzeń komputerowych; wydruk może być również bardziej praktyczny od debugowania za pomocą przełączników.

Na współdzielonych komputerach (np. na serwerach systemowych bądź urządzeniach, pracujących w trybie wsadowym), zrzuty pamięci umożliwiają debugowanie systemu w trybie off-line, dzięki czemu system może natychmiast wznowić pracę.

Zrzuty pamięci pozwalają użytkownikowi zapobiec awarii poprzez analizę zawartości, a także wykonanie analizy porównawczej kilku awarii. W przypadku wbudowanych systemów, debugowanie bezpośrednio na komputerze może być niepraktyczne, więc analiza zrzutu może odbywać się na innej maszynie. Niektóre systemy operacyjne, takie jak wczesne wersje Uniksa nie wspierają podłączania debuggera do uruchomionych procesów, więc zrzuty pamięci były niezbędne do uruchomienia debuggera na zawartości pamięci procesu.

Zrzuty te mogą być wykorzystywane do przechwytywania danych uwolnionych w czasie dynamicznej alokacji pamięci, a tym samym mogą być użyte do odzyskania informacji z programu, który nie jest już uruchomiony. W przypadku braku interaktywnego debuggera, zrzut pamięci może być używany przez wytrwałych programistów w celu określenia błędu poprzez bezpośrednie badanie.

Analiza

Zrzut pamięci reprezentuje całą zawartość przestrzeni adresowej procesu, którego zrzut wykonano. W zależności od systemu operacyjnego, zrzut może zawierać (bądź nie zawierać) kilka struktur danych w celu ułatwienia interpretacji regionów pamięci. W takich systemach, wymogiem udanej interpretacji jest to, aby program (lub użytkownik) interpretujący zrzut rozumiał strukturę wykorzystania pamięci programu.

Debugger może korzystać z tablicy znaków (o ile taka istnieje), aby pomóc programiście zinterpretować zrzut, symbolicznie identyfikując zmienne i wyświetlając kod źródłowy; jeśli tablica symboli nie jest dostępna, interpretacja zrzutu możliwa będzie na mniejszą skalę; ale może wciąż być wystarczająca by umożliwić określenie przyczyny problemu. Istnieją również narzędzia specjalnego przeznaczenia zwane analizatorami zrzutów. Jednym z popularnych narzędzi, dostępnych w wielu systemach operacyjnych, jest Objdump.

We współczesnych uniksopodobnych systemach operacyjnych, administratorzy i programiści mogą odczytywać pliki zrzutu pamięci za pomocą Binarnego deskryptoru pliku biblioteki (BFD), GNU Debuggera (gdb) oraz objdump, który używa tej biblioteki. Ta biblioteka będzie dostarczać surowe dane dla danego adresu w obszarze pamięci ze zrzutu; nie posada ona informacji na temat zmiennych lub struktur danych w tym regionie pamięci, zatem aplikacja wykorzystująca bibliotekę do odczytu zrzutu będzie musiała ustalić adresy zmiennych i określić układ struktur danych, np. za pomocą tablicy symboli programu, poddawanego debugowaniu.

Analitycy zrzutów w wyniku błędu programów w systemach Linux mogą używać do tego programu „kdump” lub LKCD[7].

Zrzuty mogą zapisać kontekst (stan) procesu w danej chwili, dzięki czemu mogą do niego odwołać się później.

Zrzut pamięci może być również wykonany na zdalnego hosta za pośrednictwem sieci (co stanowi zagrożenie dla bezpieczeństwa)[8].

Przypisy

  1. AIX 7.1 information.
  2. core(4): Process core file – strona podręcznika systemu Linux
  3. Brian W. Kernighan: Jak UNIX tworzył historię. Gliwice: Helion, 2021, s. 76–77. ISBN 978-83-283-7163-7.
  4. Cory Janssen: What is a Database Dump? – Definition from Techopedia. W: Techopedia.com [on-line]. [dostęp 2015-06-29].
  5. How to configure a computer to capture a complete memory dump. W: sophos.com [on-line]. 12 lipca 2010. [dostęp 2015-06-29].
  6. storage dump definition.
  7. Sreekrishnan Venkateswaran: Essential Linux device drivers. Prentice Hall, 2008, s. 623, seria: Prentice Hall open source software development series. ISBN 978-0-13-239655-4. [dostęp 2010-07-15]. Cytat: Until the advent of kdump, Linux Kernel Crash Dump (LKCD) was the popular mechanism to obtain and analyze dumps..
  8. Fedora Documentation Project: Fedora 13 Security Guide. Fultus Corporation, 2010, s. 63. ISBN 978-1-59682-214-6. [dostęp 2010-09-29]. Cytat: Remote memory dump services, like netdump, transmit the contents of memory over the network unencrypted..