Como despejar memória em um arquivo em gdb (osx)? Preciso resgatar meu trabalho


9

Preciso saber como despejar memória no Safari.app em um arquivo.

Entrei no anexo 6741 do gdb (meu PID do safari).

O que agora?

Tentei procurar ajuda no gdb no google, mas não consegui encontrar nada que me dissesse o que fazer, mesmo ao pesquisar "como despejar memória no gdb" :(

Eu tentei "ajudar a despejar", isso me deu vários comandos, mas nenhum deles funcionou. O mais próximo que cheguei foi:

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

Então, qual é o endereço de parada? Eu não sei? Como devo saber o endereço de parada? Tentei pesquisar no google por "" endereço de parada ausente "gdb", não ajudou. Não faço ideia de como obtenho o endereço de parada.

Eu tentei isso:

(gdb) memória de despejo ~ / safaridump.bin 0 0xffffffff

Isso também não funcionou.

Eu tenho esse:

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

Eu realmente não entendo isso. Tudo o que eu quero é a minha memória no Safari, gravada em um arquivo.

É realmente importante para mim. Passei cerca de duas horas digitando meu pobre coração no Safari, escrevendo algumas informações realmente importantes. E então, o site idiota em que eu estava escrevendo não aceitou minha postagem, porque eu havia demorado tanto a escrevê-la que havia "desconectado". Quando eu entrei novamente, minha postagem estava perdida.

Eu realmente quero essa escrita de volta. Tudo o que eu quero é a memória do Safari, para que eu possa pesquisar no conteúdo algumas palavras-chave para ver se consigo recuperar minha escrita.

Alguma idéia para alguém?

No mínimo, mesmo se eu não receber meus textos de volta, aprenderei algo sobre o gdb. O que pode ser útil no meu desenvolvimento de software;)

Obrigado se você puder ajudar! Isso significaria muito para mim. Vou deixar o Safari e o gdb em execução, até obter uma resposta. Não vou deixar isso passar até que descubra que posso ou não recuperar minha escrita.

Se alguém quiser dar respostas mais gerais sobre como recuperar o trabalho perdido ... isso é uma coisa boa. Como programas para pesquisar em todo o meu disco rígido por seqüências específicas que poderiam estar na VRAM antes que o trabalho fosse perdido.

...

http://www.mail-archive.com/use-revolution@lists.runrev.com/msg22978.html Esta página diz que kill -9 não gera um dump principal. Apesar do que esta página diz http://developer.apple.com/mac/library/technotes/tn2004/tn2124.html#SECCOREDUMPS , este comando "kill -ABRT (PID HERE)" não criará um dump principal.

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 ..
macos  gdb 

11
+1 de simpatia positiva - Não estou otimista sobre as perspectivas de recuperar seus dados, considerando o que você já tentou. Mas é uma pergunta de depuração legítima, claramente escrita, com detalhes pertinentes incluídos: não acho que mereça ser votado!
21711 Jim Lewis

NSD. Como você encontra o fim da pilha? Qual é o comando que você precisa digitar para obter o número retornado para você? Você realmente sabe? Ou você está apenas tentando não me ajudar?

Isso não está funcionando muito bem. Eu tentei o seguinte: < developer.apple.com/mac/library/documentation/DeveloperTools/… > Então digitei "gcore bla2.bin". E acho que entendo? "Comando indefinido:" gcore ". Tente" ajuda "." Os documentos da Apple dizem que essa função não está disponível em alguns sistemas. Eu acho que isso significa Macs também? Eu me pergunto por docs da Apple teria informações genéricas sobre o gdb UNIXy que não especifica o comportamento do OSX ...

developer.apple.com/mac/library/documentation/DeveloperTools/… foi o link, de alguma forma ele foi quebrado?

Após um pouco mais de experimentação, descobri o seguinte: "despejar memória binária ~ / dump3.bin 0 0x0000FFFF" produziu alguns dados que não eram inteiramente zeros. Mas ... não havia nada de valor aqui e eram apenas os primeiros 64 KB. Este ... "despejar memória binária ~ / dump3.bin 0 0x000fFFFF" produziu um arquivo inteiramente contendo zeros. 1 MB de zeros. Eu não tenho ideia do porquê. Meu palpite (até que alguém que saiba como usar o gdb realmente ajude), é que já cruzei regiões "não utilizadas", que nem sequer foram alocadas pelo malloc. E por isso, o gdb gera zeros. Depois de tudo, o Safari contém mais do que 1 MB de dados;)

Respostas:


6

Ei pessoal, descobri como gerar um coredump no OSX!

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

Existe um programa para download lá, na forma de fonte. Eu baixei, compilei e, hooray! Funcionou! Ele gerou um dump de núcleo de quase 1 GB!

Se a informação está ou não lá, não importa muito agora. Aprendi como gerar coredumps no OSX, o que definitivamente pode ser uma habilidade útil como desenvolvedor de software;) Você nunca sabe quando um dump principal pode ser útil.

Posso imaginar alguns anos em que estou fazendo um trabalho importante, e preciso de um despejo básico para descobrir o que está acontecendo, e esse aplicativo "gcore" é o que eu precisava. Mesmo que valha a pena uma vez ... isso é uma coisa boa.


11
Você também pode instalá-lo com: brew install gcore
Guido

Você pode usar estas instruções aqui para instalar rapidamente o gcore. Se aparecer "bash: brew: command not found", instale o homebrew usando este link .
I'm_With_Stupid

gcoreestá incluído no macOS desde a 10.12 Sierra. Ele está localizado em /usr/bin/gcoree também possui uma página de manual em /usr/share/man/man1/gcore.1. Isto é ainda confirmado pelo Homebrew que se recusa a instalar gcorepara/usr/local/bin a Serra ou superior.
GDP2 6/06/06

1

O Safari salva os dados do formulário para todos os formulários (a menos que você o desative ou o site marque o formulário como não deve ser salvo), em um arquivo de banco de dados criptografado. Você pode encontrar a senha do arquivo no seu conjunto de chaves de login, e o arquivo está em ~/Library/Safari/Form Values, portanto, teoricamente, você pode extrair os dados do arquivo e ver se o que você digitou está lá.

No entanto, eu tive um hack e não consigo descobrir qual é o formato do arquivo ou como ele é criptografado, por isso não sei como obter o conteúdo, tenho certeza de que alguém o faz :)


Se o Safari salvou a postagem neste arquivo, você também pode recuperá-la simplesmente acessando o mesmo formulário e digitando as primeiras letras do texto perdido. O todo deve aparecer como sugestão de preenchimento automático.

A coisa de preenchimento automático não funciona para o conteúdo da postagem. Funciona apenas para campos de linha única. Artigos não inteiros com centenas de linhas.

Obrigado. Duvido que este arquivo contenha conteúdo da postagem. Consegui despejar de 0 a 7ffffFFFF, criando um arquivo de 2 GB. No entanto, parecia conter inteiramente zeros. Algo não está bem aqui. Por que isso ?: despejar memória ~ / bla.bin 0 0x7fffFFFF Resultar em um arquivo inteiramente contendo zeros? O Safari não está rodando em zeros, é? Estou assumindo que deve ter algum código dentro dele? ;)

0

Você sempre pode ativar o logon no GDB set logging on

Em seguida, tudo o que você faz é impresso no arquivo de log (geralmente gdb.txt). Assim, você pode começar a imprimir a memória usando o xcomando e tudo irá para o arquivo de log e também para a tela.


0

Veja se o OSX possui um comando pmap, ele mostrará a memória mapeada de qualquer processo em execução. Isso geralmente é lido em / proc em sistemas Linux. Em seguida, se você estiver procurando por uma informação específica, poderá usar o comando gdb find. Digite help find in gdb para obter mais instruções.


-1

Eu sei, fio velho ...

O gdb possui um comando interno para despejar uma imagem principal do processo / programa atual.

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

os dois comandos fazem o mesmo, o nome do arquivo é opcional, o padrão é ' core. <process_ip> '

Hã! parece que existe até um utilitário instalado (com gdb) chamado 'gcore' para despejar também um programa em execução no momento. Obviamente, é mais fácil pausar o processo com o gdb e depois despejá-lo.

Encontrar coisas novas todos os dias! ... mas o gdb tem a função integrada ... só você sabe ..


(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 parece sugerir que não é implementado no OS X.
Slipp D. Thompson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.