如何将内存转储到gdb(OSX)中的文件?需要拯救我的工作


9

我需要知道如何将Safari.app中的内存转储到文件中。

我输入了gdb attach 6741(我的野生动物园PID)。

怎么办?

我尝试在Google上的gdb上搜索帮助,但是即使搜索“如何在gdb中转储内存”,我也找不到任何告诉我该怎么做的内容:(

我尝试了“帮助转储”,它给了我很多命令,但是没有一个起作用。我最接近的是:

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

那么终止地址是什么?我不知道?我怎么知道停靠地址?我尝试在Google上搜索““缺少终止地址” gdb“,但没有帮助。我不知道该如何获得停止地址。

我尝试了这个:

(gdb)转储内存〜/ safaridump.bin 0 0xffffffff

那也不起作用。

我懂了:

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

我真的不明白这一点。我想要的只是将我在Safari中的内存写入文件。

对我来说真的很重要。我花了大约2个小时在Safari中输入我的可怜的心,写下了一些非常重要的信息。然后我正在写的那个愚蠢的网站不接受我的帖子,因为我花了很长时间写它,以至于我“退出了”。在我重新登录时,我的帖子已经丢失。

我真的很想把这篇文章写回来。我想要的只是Safari的内存,因此我可以在它的内容中搜索一些关键字,以查看是否可以回信。

有任何想法吗?

至少,即使我不回信,我也会学到一些有关gdb的知识。在我的软件开发中可能会派上用场;)

谢谢您的帮助!这对我来说意义重大。在得到答案之前,我将使Safari和gdb保持运行状态。我要放手,直到我发现我可以或不可以收回我的著作。

如果有人想就如何找回丢失的工作给出更一般的答案……那是一件好事。例如程序,用于在我的整个硬盘上搜索丢失工作之前可能已存在于VRAM中的特定字符串。

...

http://www.mail-archive.com/use-revolution@lists.runrev.com/msg22978.html此页面显示kill -9不会生成核心转储。尽管此页面说的是http://developer.apple.com/mac/library/technotes/tn2004/tn2124.html#SECCOREDUMPS,但该命令“ kill -ABRT(PID HERE)”不会创建核心转储。

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 

1
+1同情投票-鉴于您已经尝试过,我对恢复数据的前景并不乐观。但这是一个合法的调试问题,清楚地写了,并包含了相关的详细信息:我认为这不应该被低估!
Jim Lewis 2009年

NSD。您如何找到堆的末端?您必须输入什么命令才能将号码返回给您?你真的知道吗 还是您只是想不帮我?

这不是很好。我尝试过:< developer.apple.com/mac/library/documentation/DeveloperTools/… >因此,我输入了“ gcore bla2.bin”。猜猜我能得到吗?“未定义的命令:“ gcore”。尝试“帮助”。” 苹果公司的文档说此功能在某些系统上不可用。我想那也意味着Macs?我想知道为什么苹果的文档会在不指定OSX行为的unixy gdb上提供通用信息...


经过更多的实验后,我发现:“ dump binary memory〜/ dump3.bin 0 0x0000FFFF”产生的数据并不完全为零。但是...这里没有任何价值,它只是前64KB。此...“转储二进制内存〜/ dump3.bin 0 0x000fFFFF”产生了一个完全包含零的文件。1MB的零。我不知道为什么。我的猜测(直到知道如何使用gdb的人真正有所帮助)是,我已经越过了“未使用”的区域,这些区域甚至没有由malloc分配。因此,gdb输出零。毕竟,Safari包含超过1MB的数据;)

Answers:


6

大家好,我发现了如何在OSX上生成coredump!

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

那里有一个源代码形式的可下载程序。我下载了它,对其进行了编译,万岁!有效!它产生了将近1GB的核心转储!

现在信息是否存在已经不重要了。我了解了如何在OSX上生成coredump,这绝对是软件开发人员的便利技能;)您永远不知道何时可以使用core dump。

我可以想象几年后我会做重要的工作,并且我需要一个核心转储来弄清楚发生了什么,而这个“ gcore”应用正是我所需要的。即使一次还清...这也是一件好事。


1
您也可以使用以下命令进行安装:brew install gcore
Guido

您可以在此处使用这些说明来快速安装gcore。如果显示“ bash:brew:命令未找到”,则使用此链接安装homebrew 。
I'm_With_Stupid

gcore从10.12 Sierra开始包含在macOS中。它位于,/usr/bin/gcore也有一个手册页/usr/share/man/man1/gcore.1。这是由自制进一步证实拒绝安装gcore/usr/local/bin塞拉利昂或更高。
GDP2

1

Safari将所有表单的表单数据(除非您将其关闭,否则站点会将表单标记为不保存)保存在加密的数据库文件中。您可以在登录钥匙串中找到该文件的密码,该文件位于~/Library/Safari/Form Values,因此从理论上讲,您可以从该文件中提取数据,然后查看其中是否键入了内容。

但是,我受到了黑客的攻击,无法确定文件的格式或加密方式,所以我不知道如何真正获取内容,但是我敢肯定有人会:)


如果Safari确实将帖子保存在此文件中,则您也可以简单地通过使用相同的表单并键入丢失文本的前几个字母来找回帖子。整个应弹出作为自动完成建议。

自动完成功能不适用于帖子内容。它仅适用于单行字段。并非整篇文章都有数百行。

谢谢。我怀疑此文件包含帖子内容。我确实设法将0转储到7ffffFFFF,创建了2GB的文件。但是,它似乎完全包含零。这里有些不对劲。为什么会这样?:转储内存〜/ bla.bin 0 0x7fffFFFF结果文件完全包含零?Safari不在零上运行吗?我假设它里面必须有一些代码?;)

0

您可以随时在GDB中打开登录 set logging on

然后,您所做的所有事情都会打印到日志文件(通常是gdb.txt)中。因此,您可以只使用x命令开始打印内存,所有内容都将进入日志文件和屏幕。


0

查看OSX是否具有pmap命令,它将为您显示任何正在运行的进程的映射内存。通常在Linux系统中从/ proc中读取。接下来,如果要搜索特定信息,则可以使用gdb find命令。在gdb中键入help find,以获取更多说明。


-1

我知道,旧线程...

gdb有一个内置命令来转储当前进程/程序的核心映像。

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

这两个命令的功能相同,文件名是可选的,默认为' core。<process_ip> '

!看起来甚至还安装了一个名为“ gcore”的实用程序(带有gdb)来转储当前正在运行的程序。当然,使用gdb暂停进程,然后转储它更容易。

每天都在寻找新事物!...但是gdb具有内置功能...就是这样。


(gdb) gcore Undefined command: "gcore". Try "help". (gdb) generate-core-file Undefined command: "generate-core-file". Try "help".
斯利普·汤普森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.