Jak zrzucić pamięć do pliku w gdb (osx)? Muszę uratować moją pracę

9

Muszę wiedzieć, jak mogę zrzucić pamięć do Safari.app do pliku.

Podałem numer gdb w załączniku 6741 (mój identyfikator PID safari).

Co teraz?

Próbowałem szukać pomocy na gdb w google, ale nie mogłem znaleźć niczego, co powiedziałoby mi, co mam robić, nawet podczas wyszukiwania „jak zrzucić pamięć do gdb” :(

Próbowałem „zrzutu pomocy”, dał mi mnóstwo poleceń, ale żadne z nich nie zadziałało. Najbliżej byłam:

(gdb) dump memory ~/safaridump.bin 0
Missing stop address.

Więc jaki jest adres końcowy? Nie wiem? Jak mam poznać adres zatrzymania? Próbowałem wyszukać w Google „” brakujący adres zatrzymania „gdb”, to nie pomogło. Nie mam pojęcia, jak uzyskać adres stop.

Próbowałem tego:

(gdb) zrzut pamięci ~ / safaridump.bin 0 0xffffffff

To też nie działało.

Mam to:

gdb stack crawl at point of internal error:
0   gdb-i386-apple-darwin               0x0012fd8f internal_vproblem + 316
1   gdb-i386-apple-darwin               0x0012ffd3 internal_verror + 43
2   gdb-i386-apple-darwin               0x00130008 align_down + 0
3   gdb-i386-apple-darwin               0x00130a21 xstrvprintf + 0
4   gdb-i386-apple-darwin               0x00130c25 xmalloc + 40
5   gdb-i386-apple-darwin               0x000045d6 dump_memory_to_file + 241
6   gdb-i386-apple-darwin               0x0012dd3d execute_command + 713
7   gdb-i386-apple-darwin               0x0008815d command_handler + 213
8   gdb-i386-apple-darwin               0x000891af command_line_handler + 1120
9   gdb-i386-apple-darwin               0x001c2486 rl_callback_read_char + 137
10  gdb-i386-apple-darwin               0x000882ed rl_callback_read_char_wrapper + 18
11  gdb-i386-apple-darwin               0x000874b7 handle_file_event + 349
12  gdb-i386-apple-darwin               0x00086e7e process_event + 131
13  gdb-i386-apple-darwin               0x00087c38 gdb_do_one_event + 1178
14  gdb-i386-apple-darwin               0x00081bfd catch_errors + 78
/SourceCache/gdb/gdb-1346/src/gdb/utils.c:1208: internal-error: virtual memory     exhausted.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) n

Naprawdę tego nie rozumiem. Chcę tylko mojej pamięci w Safari zapisanej w pliku.

To dla mnie bardzo ważne. Spędziłem około 2 godzin na pisaniu mojego biednego serca w Safari, zapisując kilka naprawdę ważnych informacji. A potem ta głupia strona, na której pisałem, nie zaakceptowała mojego postu, ponieważ napisałam go tak długo, że „wylogowałam się”. Kiedy się ponownie zalogowałem, mój post został utracony.

Naprawdę chcę to odpisać. Chcę tylko pamięci z Safari, więc mogę przeszukać jej zawartość pod kątem kilku słów kluczowych, aby sprawdzić, czy mogę odzyskać swoje pisanie.

Jakieś pomysły?

Przynajmniej, nawet jeśli nie odzyskam pisma, nauczę się czegoś o gdb. Co może się przydać w rozwoju mojego oprogramowania;)

Dzięki, jeśli możesz pomóc! To wiele by dla mnie znaczyło. Opuszczę Safari i gdb, dopóki nie otrzymam odpowiedzi. Nie pozwolę temu odejść, dopóki nie dowiem się, że mogę odzyskać pisanie.

Jeśli ktoś chce udzielić bardziej ogólnych odpowiedzi na temat odzyskiwania utraconej pracy ... to dobrze. Takie jak programy do przeszukiwania całego dysku twardego w poszukiwaniu określonych ciągów, które mogły znajdować się w pamięci VRAM przed utratą pracy.

...

http://www.mail-archive.com/[email protected]/msg22978.html Ta strona mówi, że kill -9 nie generuje zrzutu podstawowego. Pomimo tego, co mówi ta strona http://developer.apple.com/mac/library/technotes/tn2004/tn2124.html#SECCOREDUMPS , to polecenie „kill -ABRT (PID TUTAJ)” nie utworzy zrzutu podstawowego.

ls -la /cores
total 0
drwxrwxr-t@  2 root  admin    68 23 Jun 07:19 .
drwxrwxr-t  38 root  admin  1360 14 Dec 16:06 ..

źródło
1
Wzmocnienie sympatii +1 - nie jestem optymistą co do perspektyw odzyskania danych, biorąc pod uwagę to, co już próbowałeś. Ale jest to uzasadnione pytanie debugowania, jasno napisane, z uwzględnieniem istotnych szczegółów: Nie sądzę, że zasługuje na to, aby być lekceważonym!
Jim Lewis,
NSD. Jak znaleźć koniec stosu? Jakie polecenie musisz wpisać, aby otrzymać numer? Czy naprawdę wiesz A może po prostu próbujesz mi nie pomóc?
To nie działa bardzo dobrze. Próbowałem tego: < developer.apple.com/mac/library/documentation/DeveloperTools/… > Więc napisałem „gcore bla2.bin”. I zgaduję, że dostanę? „Niezdefiniowane polecenie:„ gcore ”. Spróbuj„ pomóc ”.” Dokumenty Apple'a mówią, że ta funkcja nie jest dostępna w niektórych systemach. Myślę, że to także oznacza komputery Mac? Zastanawiam się, dlaczego dokumenty Apple miałyby ogólne informacje na temat uniksowego gdb, które nie określają zachowania OSX ...
Po nieco więcej eksperymentach znalazłem to: „zrzut pamięci binarnej ~ / dump3.bin 0 0x0000FFFF” wytworzył pewne dane, które nie były całkowicie zerami. Ale ... nie było tu nic wartościowego i był to tylko pierwszy 64 KB. To ... „zrzut pamięci binarnej ~ / dump3.bin 0 0x000fFFFF” wytworzył plik całkowicie zawierający zera. 1 MB zer. Nie mam pojęcia dlaczego. Domyślam się (dopóki ktoś, kto wie, jak korzystać z gdb, naprawdę pomaga), to że przekroczyłem „nieużywane” regiony, które nie zostały nawet przydzielone przez Malloc. Z tego powodu gdb wyświetla zera. W końcu Safari zawiera ponad 1 MB danych;)

Odpowiedzi:

6

Cześć wszystkim, znalazłem sposób na wygenerowanie rdzeni w OSX!

http://osxbook.com/book/bonus/chapter8/core/

Istnieje tam program do pobrania, w formie źródłowej. Pobrałem go, skompilowałem i, brawo! Zadziałało! Wygenerował prawie 1 GB zrzutu pamięci!

To, czy informacje tam są, nie ma teraz znaczenia. Nauczyłem się, jak generować zrzuty rdzeniowe w OSX, co zdecydowanie może być przydatną umiejętnością jako programista;) Nigdy nie wiadomo, kiedy zrzut rdzenia może się przydać.

Mogę sobie wyobrazić, że po kilku latach wykonuję ważną pracę i potrzebuję zrzutu pamięci, aby dowiedzieć się, co się dzieje, a ta aplikacja „gcore” jest tym, czego potrzebowałam. Nawet jeśli raz się opłaca ... to dobra rzecz.

boytheo
źródło
1
Możesz go również zainstalować za pomocą: brew install gcore
Guido
Możesz użyć tych instrukcji tutaj, aby szybko zainstalować gcore. Jeśli jest napisane, że „bash: brew: command not found”, zainstaluj homebrew używając tego linku .
I'm_With_Stupid,
gcorejest zawarty w macOS od 10.12 Sierra. Znajduje się na, /usr/bin/gcorea także ma stronę podręcznika na /usr/share/man/man1/gcore.1. To jest dodatkowo potwierdzony przez Homebrew który odmawia zainstalowania gcorena/usr/local/bin temat Sierra lub wyższej.
PKB2
1

Safari zapisuje dane formularza dla wszystkich formularzy (chyba że je wyłączyłeś lub witryna oznaczy formularz jako niezapisywany) w zaszyfrowanym pliku bazy danych. Możesz znaleźć hasło do pliku w pęku kluczy logowania, a plik jest w ~/Library/Safari/Form Values, więc teoretycznie możesz wyodrębnić dane z pliku i sprawdzić, czy tam jest to, co wpisałeś.

Miałem jednak włamanie i nie jestem w stanie ustalić, jaki jest format pliku ani w jaki sposób jest on szyfrowany, więc nie wiem, jak uzyskać dostęp do zawartości, jestem pewien, że ktoś to robi :)

James
źródło
Jeśli Safari zapisało post w tym pliku, możesz go odzyskać, przechodząc do tego samego formularza i wpisując kilka pierwszych liter utraconego tekstu. Całość powinna pojawić się jako sugestia autouzupełniania.
Funkcja autouzupełniania nie działa w przypadku treści postów. Działa tylko w przypadku pól jednowierszowych. Nie całe artykuły z setkami linii.
Dzięki. Wątpię, czy ten plik zawiera treść postu. Udało mi się zrzucić 0 do 7ffffFFFF, tworząc plik 2 GB. Wydawało się jednak, że zawiera całkowicie zera. Coś tu nie pasuje. Dlaczego to miałoby: zrzut pamięci ~ / bla.bin 0 0x7fffFFFF Wynik w pliku całkowicie zawierającym zera? Safari nie działa na zerach, prawda? Zakładam, że musi zawierać w sobie jakiś kod? ;)
0

Zawsze możesz włączyć logowanie w GDB set logging on

Następnie wszystko, co robisz, jest drukowane do pliku dziennika (zwykle gdb.txt). Możesz więc po prostu rozpocząć drukowanie pamięci za pomocą xpolecenia, a wszystko przejdzie do pliku dziennika, a także ekranu.

alesplin
źródło
0

Sprawdź, czy OSX ma polecenie pmap, pokaże ono zmapowaną pamięć dowolnego uruchomionego procesu. Zwykle jest to odczytywane z / proc w systemach Linux. Następnie, jeśli szukasz konkretnej informacji, możesz użyć polecenia gdb find. Wpisz help find w gdb, aby uzyskać więcej instrukcji.

ychaouche
źródło
-1

Wiem, stary wątek ...

gdb ma wbudowane polecenie do zrzucenia obrazu rdzenia bieżącego procesu / programu.

generate-core-file [filename]
gcore [filename]

oba polecenia robią to samo, nazwa pliku jest opcjonalna, domyślnie „ core. <ipprocess_ip>

Huh! wygląda na to, że jest nawet zainstalowane narzędzie (z gdb) o nazwie „gcore” do zrzutu aktualnie uruchomionego programu. Oczywiście łatwiej jest zatrzymać proces za pomocą gdb, a następnie go zrzucić.

Znajdowanie nowych rzeczy każdego dnia! ... ale gdb ma wbudowaną funkcję ... po prostu wiesz ...

lornix
źródło
(gdb) gcore Undefined command: "gcore". Try "help". (gdb) generate-core-file Undefined command: "generate-core-file". Try "help".
Slipp D. Thompson,
2
sourceware.org/gdb/onlinedocs/gdb/Core-File-Generation.html wydaje się sugerować, że nie jest zaimplementowany w systemie OS X.
Slipp D. Thompson