2015-08-28 31 views
5

Mam plik wykonywalny i gcore.związek między pamięcią wirtualną a zrzutem rdzenia

Utworzono plik zrzutu pamięci głównej z gcore.

Teraz chciałbym zmapować wirtualny adres pliku wykonywalnego do zrzutu pamięci.

Wiem, że zrzut rdzenia jest zrzutem pamięci pliku wykonywalnego i jeśli chciałbym przeanalizować adres wirtualny z poziomu zrzutu pamięci. Czy mogę założyć, że wirtualny adres 0x0000 jest równy przesunięciu 0x0000 zrzutu pamięci?

Odpowiedz

3

wiem, że zrzut jest zrzut pamięci z pliku wykonywalnego,

nr Rdzeń zrzutu w gdb (gcore wskazuje używasz tego) jest zazwyczaj w formacie ELF, tak istnieje obszerny nagłówek definiujący jakie mapy do czego.

Nie jestem do końca pewny, ile GDB/linux używa do manipulowania przestrzenią adresową podczas zrzucania rdzeni, ale nie można założyć, że przesunięcie pliku x zamieni się w przesunięcie pamięci x - ponieważ wirtualna przestrzeń adresowa może być ogromna w zakresie przestrzeń adresowa, z której korzysta tylko z kilku stron. (np. proces 64-bitowy może mieć wirtualną przestrzeń adresową, która jest o wiele większa niż twój dysk twardy, podczas gdy może ona faktycznie zarezerwować tylko pamięć, która jest znacznie mniejsza, a nawet tego, nie wszystkie strony muszą być rzeczywiście przydzielone).

GDB może jednak odczytać te nagłówki, a jeśli poprosisz go o wydrukowanie rzeczy (np. Za pomocą polecenia print lub x), otrzymasz odpowiednią odpowiedź.

Jeśli chcesz przeczytać plik zrzutu pamięci głównej, dobrym rozwiązaniem jest skorzystanie z możliwości GDB. Na szczęście jest libgdb, który robi dokładnie to samo dla twojej aplikacji C/C++. Zasadniczo porozmawiajmy z GDB tak, jakbyś był użytkownikiem przed powłoką gdb. Dlatego wymyśl, jak zrobić to, co chcesz w GDB, a następnie użyj libgdb, aby zrobić to programowo.

Jeśli chcesz to zrobić na niskim poziomie (nie rób tego, to jest kłopot, a GDB jest naprawdę tym, czego chcesz użyć, faktycznie) możesz bezpośrednio użyć Binary File Descriptor Library do parsowania i przedstawienia zrzutu pamięci. Jest to istotna część GDB i trudno będzie go uruchomić z własnym programem C++ bez ponownego wdrażania wielu procedur GDB.

+0

Czy znasz jakiś sposób, aby odczytać dane adresowe wirtualne w core dump z C++? –

+0

@JohnDoyle: zobacz poprawkę do mojej odpowiedzi. –

+0

Dziękuję bardzo! jesteś bohaterem! :) –