【发布时间】:2011-05-08 12:34:50
【问题描述】:
是否可以在任何二进制文件中保存一些缓冲区,以便在独立的十六进制编辑器中查看。
例如,我可以将数据从 VS 中的内存窗口保存到十六进制转储,但不能保存为 ASCII 吗?
【问题讨论】:
-
如果也缺少它,那将是一个不错的插件。
标签: visual-studio debugging memory window
是否可以在任何二进制文件中保存一些缓冲区,以便在独立的十六进制编辑器中查看。
例如,我可以将数据从 VS 中的内存窗口保存到十六进制转储,但不能保存为 ASCII 吗?
【问题讨论】:
标签: visual-studio debugging memory window
user142207 在调查 VS 内部方面做得很好,我推荐该解决方案。 我的同事 Sergey S. 发明了另一种方法, 这非常有用:
窗户:
使用几个函数ReadProcessMemory/WriteProcessMemory。它需要一个独立的应用程序来调用这些函数,其目标进程 id 如下:
dumper.exe <debugged process id> <memory_start_addr> <memory_length>
这个应用程序可以在 VS 调试会话期间直接调用(与 Linux 相比,Linux 没有这种可能性)。我们可以在监视窗口中捕获内存地址,然后将地址传递给转储程序,瞧。正如user142207在他的文章中所说,它在长时间重新编译的项目中非常有用。
Linux/MacOS 有不同的方法。例如:从 gdb 控制台,使用命令转储内存。该命令也可以在调试会话期间直接使用。
【讨论】:
StNickolay 的答案引用了一些名为“dumper”的工具,但不知何故,我无法在网上找到它(另外,user142207 早已不复存在)。所以我创建了相同的工具——它打开了正在运行的进程(即使附加了调试器)并将其部分内存复制到文件中。当您想为以后存储一些结构并且不想与 VS Memory View“复制”输出作斗争时非常有用。享受吧!
【讨论】:
有一个扩展名:https://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugTool。它在 VisualStudio 窗口中打开其控制台,并允许将内存转储到文件和其他一些内存操作(在控制台中输入“帮助”以获取详细信息)。
此外,一些十六进制编辑器(例如Hex Editor Neo)可以将进程内存作为普通文件浏览。也许您也会找到具有此功能的免费编辑器。
【讨论】:
Visual Studio 调试器中的监视窗口可以运行函数,如果您正在调试自己的代码,您可以在代码中添加一些函数来将缓冲区保存到文件并从监视窗口调用它。 例如:
void WriteToFile(char* name, void* buffer, size_t size)
{
FILE* fp;
fopen_s(&fp, name, "wb");
fwrite(buffer, 1, size, fp);
fclose(fp);
}
然后在监视窗口中输入类似这样的内容:
WriteToFile("c:\\temp\\dump.dat", buffer, len)
【讨论】:
我怀疑你可以从ClrMD 得到你想要的,然后你可以随心所欲地使用相同的数据。
如果您真的想要一个核心转储,那么 WinDbg 可能就是您要找的吗?
MSDN 博客上也有这篇文章:https://blogs.msdn.microsoft.com/dondu/2010/10/24/writing-minidumps-in-c/
它描述了如何以编程方式在 .NET 中创建类似于转储的东西。
【讨论】: