2013-08-05 33 views
6

strona Wikipedii na Core dump mówiCzy jest to plik wykonywalny rdzenia głównego?

W systemach uniksowych, rdzeń wysypisk zazwyczaj używają standardowego wykonywalny image-format:

a.out in older versions of Unix, 
ELF in modern Linux, System V, Solaris, and BSD systems, 
Mach-O in OS X, etc. 

Czy to znaczy rdzeń wysypisko jest wykonywalny przez samo? Jeśli nie, dlaczego nie?

Edit: Ponieważ @ WumpusQ.Wumbley wspomina coredump_filter w komentarzu, może powyższe pytanie powinno być: może rdzeń wysypisko być produkowane tak, że jest wykonywalny przez siebie?

+0

Czego można się spodziewać, gdyby zrzut rdzenia miał zostać wykonany? – icedwater

+0

Wierzę (ale nie jestem pewien), że zrzut rdzenia zawiera również instrukcje maszyny z oryginalnego pliku wykonywalnego, ponieważ są one częścią obrazu pamięci procesu. Jeśli tak, oczekiwałbym, że uruchomi te instrukcje. Nie jestem całkowicie pewien, czy tak się stanie, a jeśli tak, to czy zacznie się od nowa, czy też spróbuje kontynuować egzekucję z przechowywanego stanu (i może znowu się zawiesi), stąd pytanie. – sundar

+5

undump: http://code.google.com/p/undump/ –

Odpowiedz

6

w starszych UNIX warianty było domyślnym zawierać tekst, jak również dane na wysypisko rdzenia ale została również podana w Format a.out, a nie ELF. Dzisiejsze domyślne zachowanie (w Linuksie na pewno, nie w 100% pewne warianty BSD, Solaris itp.) Ma mieć zrzut główny w formacie ELF bez sekcji tekstowych, ale zachowanie to można zmienić.
Jednak zrzut rdzenia nie może zostać wykonany bezpośrednio w żadnym wypadku bez pomocy. Powodem jest to, że brakuje dwóch rzeczy z prostego pliku core. Jeden to punkt wejścia, drugi to kod przywracający stan procesora do stanu na lub tuż przed pojawieniem się zrzutu (domyślnie brakuje również sekcji tekstowych).
W systemie AIX używane było narzędzie zwane zrzutu, ale nie mam pojęcia, co się z nim stało. Nie istnieje w żadnej standardowej dystrybucji Linuksa, jaką znam. Jak wspomniano powyżej (@WumpusQ) istnieje również próba podobnego projektu dla Linuksa wspomnianego w powyższych komentarzach, jednak ten projekt nie jest kompletny i nie przywraca stanu procesora do pierwotnego stanu. Jest jednak wystarczająco dobry w niektórych konkretnych przypadkach debugowania.
Warto również wspomnieć, że istnieją inne pliki w formacie ELF, które nie mogą być wykonywane, a które nie są plikami core. Takich jak pliki obiektowe (dane wyjściowe kompilatora) i pliki .so (obiekt współdzielony). Przed uruchomieniem wymagają one etapu łączenia w celu rozwiązania adresów zewnętrznych.

+0

Dziękuję bardzo za jasne wyjaśnienie, a punkt dotyczący plików .o i .so jest prawidłowy, o którym nie myślałem. Dostałem również podobną odpowiedź na temat punktu wejścia itp. Od twórcy narzędzia 'undump', teraz opiszę to jako kolejną odpowiedź ze względu na kompletność. Przyjmuję twoją odpowiedź, ale na wszelki wypadek zostawiam otwartą nagrodę. – sundar

+0

Kolejnym dużym problemem związanym z koncepcją "zrzutu" jest utrata całego stanu powiązanego z deskryptorami plików otwartymi w czasie awarii. –

+0

@ WumpusQ.Wumbley tak, twórca 'undump' wspomniał o tym w swoim e-mailu na ten temat, wysłałem tę odpowiedź jako kolejną odpowiedź na to pytanie. – sundar

1

Istnieją dwa typy zrzutów rdzenia: zrzuty rdzenia systemu i zrzuty rdzenia procesowego. Różnią się one wieloma aspektami, takimi jak sposób ich tworzenia i metoda ich analizy.

W większości przypadków sygnałem prowadzącym do awarii aplikacji jest SIGSEGV (naruszenie segmentacji) lub SIGBUS.

podobne rodzaje sygnałów wywołać zrzutu .. może powołać go ..

1

Wysłałem e-mail to pytanie twórca narzędzia undump dla jego wiedzy, i dostałem następującą odpowiedź:

Jak wspomniano w niektórych tamtejszych odpowiedzi, to jest możliwe włączenie sekcje kodu przez ustawienie coredump_filter, ale nie jest to domyślna domyślna wersja dla Linuksa (i nie jestem całkowicie pewna co do wariantów BSD i Solaris). Jeśli różne sekcje kodu są zapisywane w oryginalnym zrzucie jądra , nic nie brakuje, aby utworzyć nowy plik wykonywalny . Wymaga to jednak pewnych zmian w oryginalnym pliku rdzeniowym (takich jak dodanie punktu wejścia i wskazanie, że pozycja wskazuje kod, który przywróci rejestr CPU). Jeśli plik core jest zmodyfikowany w ten sposób, stanie się plikiem wykonywalnym i będzie można go uruchomić.Niestety, niektóre stany nie zostaną zapisane, aby nowy plik wykonywalny nie mógł być uruchamiany bezpośrednio. Otwarte pliki , gniazda, pestki itp. Nie będą otwarte i mogą nawet wskazywać na inne dyski twarde (co może powodować różnego rodzaju dziwne rzeczy). Jednak najprawdopodobniej będzie to wystarczające dla większości zadań związanych z debugowaniem, takich jak uruchamianie małych funkcji z gdb (tak, że nie otrzymasz "nie uruchamiającego się" pliku) " ".

0

Jak mówili inni, nie sądzę, że można wykonać plik zrzutu pamięci bez oryginalnego pliku binarnego.

Jeśli chcesz debugować plik binarny (i zawiera on symbole debugowania, innymi słowy, nie jest on usuwany), możesz uruchomić gdb binary core.

Wewnątrz gdb można użyć polecenia bt (śledzenie), aby uzyskać śledzenie stosu, gdy aplikacja uległa awarii.