从堆里找回“丢失”的代码

简介: 从堆里找回“丢失”的代码

前言

前一阵子,使用小乌龟(TortoiseGit)提交代码的时候,错误的 Revert 了部分代码,本文记录了找回这部分代码的过程。文章标题致敬张银奎老师《格蠹汇编》的第一章 —— 从堆里抢救丢失的博客。

说明: 本文的截图都是我用新建的示例工程截取的。

缘起

最近,程序运行的时候,执行某个功能会崩溃,根据经验猜测,应该是序列化,反序列化的问题。由于手里没有关键的 pdb,调试起来比较费劲,而且项目比较急,暂时先不使用这个功能。准备先提交其它功能的代码。

大意失荆州

按照惯例,提交之前先检查一下提交内容。(p.s. 这是个好习惯)

后截的图

发现有一部分代码会导致序列化有问题。一激动(当时被那个崩溃问题搞得很烦躁),点击了Revert...

revert-source

点完了就后悔了 —— 这段代码是为其它功能写的,应该保留。由于在提交代码前,关闭了vs ,没办法通过 vs 找回了。

说明:如果文件在 vs 外部被修改,vs 会给出类似下图的提示,这时候我们选 No 不重新加载就可以了。
reload-modified-file

这可是我辛辛苦苦,一行一行敲出来的啊。就这么 “丢了” 吗?丢是不可能丢的,这辈子都不可能丢的。

峰回路转

幸亏没有烦躁到直接干掉小乌龟。想起张老师的《格蠹汇编》第一章就是 “从堆里抢救丢失的博客”,讲的是使用 windbg 从浏览器中找回未能成功发表的博文的故事。赶紧使用 windbg 附加到小乌龟上。先用 .dump /ma e:\dumps\tortoisegit.dmp 保存一份完整转储。

保存完整转储

有了转储文件,即使关闭小乌龟也不怕了!稍微平复下我跌宕起伏的内心,应该用哪个命令搜索内存呢?很早之前从张老师的文章里了解到 s 命令可以搜索内存。加之,前一段日志刚好尝试解决过类似的问题,做了笔记。很快就把上次整理好的命令粘贴到 windbg 中进行查找。

搜寻关键字

有印象的关键字是 args.Contains("--all")。在 windbg 中输入 !address -f:heap,PAGE_READWRITE -c:"s -u %1 %2 args.Contains(\"--all\")"

搜寻关键字

搜到两处,分别使用 du 命令查看这两处的内容。

查看第一个地址

查看第二个地址

明显第一处的内容比较全,选用第一处的地址进行进一步的搜索。如果能找到文件的开始和结束就最好了。经过简单的尝试,找到了开始和结束的地址。截图的话会比较长,这里就不截图了。开始地址是 0000022f``dae8e5f8-0x3538,结束地址是 0000022f``dae8f030

说明: 也可以直接使用命令 s -u 0x0 L?0xffffffff`ffffffff "args.Contains(\"--all\")",更简单明了。

保存到文件

知道开始地址和结束地址了,剩下的就是如何把对应的内容保存到文件中了。windbg 已经为我们准备好了一条命令 —— .writemem。输入:.writemem e:\dumps\tortoisegit.cs 0000022f``dae8e5f8-0x3538 0000022f``dae8f030 即可把指定范围的数据保存到文件中。

保存到文件

查看保存的文件,果然是对应的文件内容!比较长,这里就不放截图了。

反思

  • 一定要养成一个良好的版本管理习惯。开发新功能的时候,最好建立一个新分支,并且随时把变更提交。等开发完了,再合并回主分支,并删掉功能分支。如果我遵循了这个原则的话,就不会出现这种问题了。当然,也不会有本篇总结了。
  • 遇到问题,一定不要鲁莽,保持冷静。如果我关了小乌龟,那么丢失的代码就真的没办法找回来了。

  • 一定要养成总结问题,记录问题的好习惯!之前,有同事也遇到了类似的问题,代码不小心弄丢了。不幸的是,没能通过这种办法找回来。幸运的是,当时调查的结果都有记录,所以这次查这个问题的时候,翻出笔记。复制粘贴,回车,搞定!一气呵成,相当舒爽!

总结

  • 使用 !address -f:heap, PAGE_READWRITE -c:"s -u %1 %2 \"unicode_string_to_search\"" 可以在堆上搜索 unicode_string_to_search

  • 可以使用更简单的 s -u start_address end_address 或者 s -u start_address L?length 搜索。

  • 使用 .writemem 可以把指定范围的数据保存到文件中。

参考资料

相关文章
|
2月前
|
存储 数据挖掘 Windows
服务器数据恢复—异常断电导致raid信息丢失的数据恢复案例
由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windows server操作系统,没有配置ups。 因为服务器异常断电重启后,raid阵列可以正常使用,所以未引起管理员的注意。后续出现的多次异常断电导致raid报错,服务器无法找到存储设备,进入raid管理模块进行任何操作都会导致操作系统死机。管理员尝试多次重启服务器,故障依旧。
|
3月前
|
数据挖掘 数据库 虚拟化
服务器数据恢复-异常断电导致服务器数据丢失的数据恢复案例
服务器数据恢复环境: dell某型号服务器中有一组通过raid卡组建的raid10,该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台,作为网站服务器使用。 服务器故障: 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这台虚拟机上的数据库数据。
服务器数据恢复-异常断电导致服务器数据丢失的数据恢复案例
|
6月前
AXURE怎么找回丢失的文件
AXURE怎么找回丢失的文件
从堆里找回“丢失”的代码相关命令简介
从堆里找回“丢失”的代码相关命令简介
|
存储 Windows
不小心把u盘里的文件删除了怎么恢复丢失怎么办?,用什么数据恢复软件恢复
自从手机和电脑可以无线传输文件后,U盘就被遗忘在包里,偶尔看见,但基本上没再用过。昨天突然想看看U盘里还有什么文件资料,结果,插在电脑上却读不出来,这是怎么回事呢?u盘在电脑上读不出来数据怎么修复?紧急求救身边的懂电脑小哥哥,他教我一招,就轻松解决了这个难题。
204 0
不小心把u盘里的文件删除了怎么恢复丢失怎么办?,用什么数据恢复软件恢复
|
存储 监控 固态存储
EasyRecovery数据恢复可以轻松恢复删除和丢失的任何数据
Ontrack EasyRecovery易恢复是由全球著名数据厂商Kroll Ontrack出品的一款专业级数据文件恢复软件,号称最好的数据恢复软件!
181 0
|
监控 数据库 数据库管理
仅仅1首歌的时间,找回误删数据
1首歌的时间能干什么?可以等个红绿灯,也可以走个神,你还可以找回误删的数据。
1411 0

相关实验场景

更多