Table of Contents
Czasami system może wyświetlać kod błędu, który mówi, jak interpretować plik zrzutu jądra systemu Linux. Przyczyn tego problemu może być łatwo.
Zaktualizowano
g. g.
# nanoBłąd segmentacji
# nanoDylemat zrzutu jądra# lsRdzeń
$ arm-linux-gdb -c Nano coreJądro jest generowane przez `nano '.Program zakończony przesłaniem SIGSEGV, błąd segmentacji.# 0 0x00019f14 w signal_init() tutaj w nano. = C: 11921192 * znak SIGINT;
$ arm-linux-gdb -zaoferowałbyś kern nano-tui
(gdb) znak komputerowy1 $ oznacza (int *) 0x0(gdb) bt# zero 0x00019f14 tylko w signal_init() na nano.c: 1192# ty 0x0001b264 co najwyżej (argc = 1, argv równa się 0xbee9de64) w nano.Can c: 2568
- przejdź do starego GDB, aby znaleźć przerwane linie, tak jak wspomniano wcześniej w: Jak mogę przeanalizować plik zrzutu pamięci za pomocą GDB, jeśli ma już parametry wiersza poleceń?
- plik główny zawiera argumenty CLI, nie ma potrzeby ponownego przesyłania grupy
-
objdump -s core
może być użyty do powrotu do zrzutowych urządzeń pamięci masowej.
#include #włącz #include #include interwał myfunc (interwał i) 4 . (int *) (NULL) oznacza i; / * Linia 7 * / zwróć mojego męża i ja - 1;int main (int argc, char ** argv) / * Konfiguracja pamięci. ( pusty ) / char data_ptr [] oznacza „Ciąg w określonym segmencie”; znak * mmap_ptr; znak 1 . text_ptr = "Linia wokół segmentu tekstu"; (puste) argv; mmap_ptr równa się (char *) malloc (sizeof (data_ptr) + 1); strcpy (mmap_ptr, data_ptr); mmap_ptr [10] 'm'; = mmap_ptr [11] 'm'; implikuje mmap_ptr [12] = 'a'; mmap_ptr [13] to 'p'; printf („adres tekstowy:% p n”, text_ptr); printf („adres danych:% p n”, data_ptr); printf ("adres mmap:% p n", mmap_ptr); / * Wywołanie funkcji all w celu przygotowania indeksu stosu. 5 . / return -ggdb3 myfunc (argc);
gcc -std = c99 -Wall -Wextra -pedantic -o main.out main.culimit -c nieograniczonyrm -f jądro./ Wyjście główne
Adres tekstowy: 0x4007d4Adres danych: 0x7ffec6739220adres mmmap: 0x1612010Błąd pustej segmentacji)
GDB (Core umieszcza nas w linii, w której wystąpiły te błędy w segmentacji, czego wielu użytkowników oczekuje podczas debugowania:
gdb -q -nh main.out core
Odczytaj symbole main.out ... gotowe.[Nowy LWP 27479]Uważano, że jądro zostało zdobyte przez `./main.out '.Program zakończony z SIGSEGV, błąd podziału.# 0 0x0000000000400635 w myfunc (i = 1) zbliża się do main.c: 77 * (int *) (NULL) dopasuj i;(gdb) bt# 0 0x0000000000400635 w myfunc At (i = 1) main.c: 7# 1 0x000000000040072b, aby rozpocząć (argc = 1, argv = 0x7ffec6739328) na main.c: 28
Argumenty CLI są przechowywane w ogromnym pliku i nie powinny być przekazywane z powrotem
Aby odpowiedzieć na konkretne pytania dotyczące argumentów CLI, dzisiaj stwierdzamy, że na przykład wielu z nas zmienia argumenty CLI. z:
rm -l core./main.out 1 2
to chwyt jest wyświetlany w poprzedniej Bactrace bez kłamstwa w naszych poleceniach:
Odczytaj token main.out ... gotowe.[Nowa LWP 21838]Jądro zostało wygenerowane jedynie przez `./main.out 9 2 '.NProgram został zakończony przy pomocy sygnału SIGSEGV, błąd segmentacji.# 0 0x0000564583cf2759 tutaj w myfunc (i = 3) na main.c: 77 4 . (liczba całkowita *) (NULL) = i; / * Grupa 7 * /(gdb) bt# 0 0x0000564583cf2759 myfunc w zasadzie tylko w (i = 3) na main.c: 7# dwa 0x0000564583cf2858 w domu (argc = 3, argv jest równe 0x7ffcca4effa8) w main.c: 2
Zwróć więc szczególną uwagę, jak od tego dnia argc = 10
. Powinno to więc oznaczać, że główny inicjator obecnie przechowuje te informacje. Jeśli musisz zgadywać, zostanie to zarejestrowane tylko jako rzeczywista sprzeczność main
, tak jak koncepcja rejestrowałaby twoje bieżące argumenty do dowolnej alternatywnej funkcji.
To naprawdę ma sens, biorąc pod uwagę, że gdy jądro jest usuwane, cały program w przestrzeni pamięci i stanie rejestru musi być zabezpieczony, co oznacza, że ma wszystkie szczegóły potrzebne do uzyskania wartości i powiedziałbym argumenty funkcji ustalając aktualną opłatę za baterię.
Sposób patrzenia na kwestie środowiskowe jest mniej oczywisty: jak pobrać zmienną otoczenia ze zrzutu jądra Zmienne środowiskowe również istnieją w pamięci, więc objdump zawiera to dodatkowe informacje, ale nie wiem, jak wygodnie wymienić kilka z nich naraz.body dla jednego wybierz to, ale pracowałem nad moimi testami:
s __około [0]
Zaktualizowano
Czy masz dość powolnego działania komputera? Denerwują Cię frustrujące komunikaty o błędach? ASR Pro to rozwiązanie dla Ciebie! Nasze zalecane narzędzie szybko zdiagnozuje i naprawi problemy z systemem Windows, jednocześnie znacznie zwiększając wydajność systemu. Więc nie czekaj dłużej, pobierz ASR Pro już dziś!
Używając materiałów Binutils, takich jak readelf
i objdump
, możemy ujednolicić informacje zawarte w jądrze plik taki jak z .
Większość/wszystko powinno być również widoczne na Twojej drodze przez GDB. Na szczęście te narzędzia Binutils oferują znacznie więcej podejścia, które przydaje się w konkretnych przypadkach zatrudnienia, podczas gdy GDB lepiej nadaje się do bardzo interaktywnej eksploracji.
plik podstawowy
opisuje nam, że większość pliku żołądka
to w rzeczywistości plik:
krytyczne: jedenaście 64-bit ELF LSB Core Lodge x86-64, wybór 1 (SYSV), styl SVR4, z './main.out'
Z tego powodu możemy to dokładniej sprawdzić za pomocą zwykłych narzędzi Binutils.
Nieskomplikowane spojrzenie na standard ELF pokazuje, że problem dotyczy w rzeczywistości typu ELF:
Elf32_Ehd.e_type == ET_CORE
człowiek 0 rdzeń
rdzeń readelf
zawiera wiele informacji o strukturze pliku. Pamięć zawarta w nagłówkach harmonogramu dziennego:
Nagłówek programu: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align UWAGA 0x000468 0x0000000000000000 0x0000000000000000 0x000b9c 0x000000 0 OBCIĄŻENIE 0x002000 0x0000000000400000 0x0000000000000000 0x001000 0x001000 R E 0x1000 OBCIĄŻENIE 0x003000 0x0000000000600000 0x0000000000000000 0x001000 0x001000 R 0x1000 OBCIĄŻENIE 0x004000 0x0000000000601000 0x0000000000000000 0x001000 0x001000 LE 0x1000
i jest tylko kilka nadmiarowych metadanych w lokalnym obszarze Notes, w szanowanym prstatus
zawiera PC:
Wyświetla notatki identyfikowane przez przesunięcie pliku 0x00000468 z pewną sumą 0x00000b9c: Opis kierunku danych właściciela CORE 0x00000150 NT_PRSTATUS (struktura prstatus) CORE 0x00000088 NT_PRPSINFO (struktura prpsinfo) CORE 0x00000080 NT_SIGINFO (dane siginfo_t) CORE 0x00000130 NT_AUXV wektor) (Pomniejszy CORE 0x00000246 NT_FILE (pliki, których dotyczy problem) Rozmiar strony: 4096 Przesunięcie od początku bezpośrednio do końca 0x0000000000400000 0x0000000000401000 0x0000000000000000 /home/ciro/test/main.out 0x0000000000600000 0x0000000000601000 0x0000000000000000 / główne / ciro / / główne. koniec 0x0000000000601000 0x0000000000602000 0x000000000000001 /home/ciro/test/main.out 0x00007f8d939ee000 0x00007f8d93bae000 0x0000000000000000 /lib/x86_64-linux-gnu/libc-2.23.so 0x00007f8d93bae000 0x00007f8d93dae000 0x00000000000001c0 /lib/x86_64-linux-gnu/libc-2.23.so 0x00007f8d93dae000 0x00007f8d93db2000 0x00000000000001c0 /lib/x86_64-linux-gnu/libc-2.23. Więc 0x00007f8d93db2000 0x00007f8d93db4000 0x00000000000001c4 /lib/x86_64-linux-gnu/libc-2.23.so 0x00007f8d93db8000 0x00007f8d93dde000 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.23. Więc 0x00007f8d93fdd000 0x00007f8d93fde000 0x00000000000000025 /lib/x86_64-linux-gnu/ld-2.23.so 0x00007f8d93fde000 0x00007f8d93fdf000 0x00000000000026 /lib/x86_64-linux-gnu/ld-2.23.so CORE 0x00000200 NT_FPREGSET (rejestr zmienno-sumowy) LINUX 0x00000340 NT_X86_XSTATE (stan rozciągnięty x86 XSAVE)
objdump -s rdzeń
Zawartość sekcji load1: 4007d0 01000200 6e672069 73747269 6e207465 .... ciąg jeśli lub kiedy te 4007e0 78742073 65676d65 6e740074 65787420 xt segment.tekstSekcja materiału Load15: 7ffec6739220 73747269 6e672069 6e206461 74612073 Znak w danych 7ffec6739230 65676d65 6e740000 00a8677b 9c6778cd Przykład....g {.gx.Treść artykułu 1612010 load4: 73747269 6e672069 6e206d6d 61702073 przewód mmap s 1612020 65676d65 6e740000 11040000 00000000 Element ..........
Zostało to przetestowane na Ubuntu 16.04 amd64, GCC 6.4.0 i binutils 2.26.1.
Przyspiesz swój komputer już dziś dzięki temu prostemu pobieraniu.
Jak odczytać podstawowy plik składowiska?
Podczas chodzenia naciśnij Ctrl + , aby przenieść rzeczywisty zrzut rdzenia. Jak najszybciej zobaczysz plik podstawowy w katalogu, w którym znajdują się klienci. Ponieważ nie mamy nowego pliku wykonywalnego debugowania, który by to obsługiwał, nasze prawo do polecenia otwiera podstawowe dane w gdb, zamiast tego związane z plikiem wykonywalnym symboli + plik podstawowy.
Jak zdekodować jakiś plik core?
Jeśli próbujesz odtworzyć ten główny plik muzyczny, upewnij się, że znajduje się on bezpośrednio w systemie operacyjnym, na który został pierwotnie dostarczony. Skopiuj plik główny do lokalizacji, tak jak w tym przypadku, jeśli jeszcze nie istnieje:funkcja przerwania [plik:]. Ustaw punkt przerwania na poziomie funkcji (w pliku).popełnić oszustwo]bt.Wydrukowaćprzeciwko.Następny.Edytuj funkcję [Plik:].
Jak przeanalizować konkretny plik zrzutu awaryjnego w systemie Linux?
Zainstaluj sprzęt Kdump. Najpierw zainstaluj kdump, który jest częścią pakietu kexec-tools.Umieść jądro awaryjne w grub. Konf.Skonfiguruj lokalizację zrzutu.Ustaw środkowy kolektor.Uruchom ponownie usługi Kdump.Ręcznie uruchom zrzut pamięci.Spójrz na pliki serca.Analiza Kdump z awarią.
How To Interpret A Linux Core Dump File
Comment Interpréter Un Fichier De Vidage De Mémoire Linux
Как интерпретировать файл дампа ядра Linux
Linux 코어 덤프 파일을 해석하는 방법
So Interpretieren Sie Eine Linux-Core-Dump-Datei
Come Interpretare Un File Dump Del Core Di Linux
Hur Man Tolkar En Linux Core Dump-fil
Cómo Interpretar Un Archivo De Volcado De Núcleo De Linux
Hoe Een Linux Core Dump-bestand Te Interpreteren?
Como Interpretar Um Arquivo Linux Core Dump