【问题标题】:save data from visual studio memory window从 Visual Studio 内存窗口保存数据
【发布时间】:2011-05-08 12:34:50
【问题描述】:

是否可以在任何二进制文件中保存一些缓冲区,以便在独立的十六进制编辑器中查看。

例如,我可以将数据从 VS 中的内存窗口保存到十六进制转储,但不能保存为 ASCII 吗?

【问题讨论】:

  • 如果也缺少它,那将是一个不错的插件。

标签: visual-studio debugging memory window


【解决方案1】:

user142207 在调查 VS 内部方面做得很好,我推荐该解决方案。 我的同事 Sergey S. 发明了另一种方法, 这非常有用:

窗户: 使用几个函数ReadProcessMemory/WriteProcessMemory。它需要一个独立的应用程序来调用这些函数,其目标进程 id 如下:

dumper.exe <debugged process id> <memory_start_addr> <memory_length>

这个应用程序可以在 VS 调试会话期间直接调用(与 Linux 相比,Linux 没有这种可能性)。我们可以在监视窗口中捕获内存地址,然后将地址传递给转储程序,瞧。正如user142207在他的文章中所说,它在长时间重新编译的项目中非常有用。

Linux/MacOS 有不同的方法。例如:从 gdb 控制台,使用命令转储内存。该命令也可以在调试会话期间直接使用。

【讨论】:

    【解决方案2】:

    StNickolay 的答案引用了一些名为“dumper”的工具,但不知何故,我无法在网上找到它(另外,user142207 早已不复存在)。所以我创建了相同的工具——它打开了正在运行的进程(即使附加了调试器)并将其部分内存复制到文件中。当您想为以后存储一些结构并且不想与 VS Memory View“复制”输出作斗争时非常有用。享受吧!

    https://github.com/Alexx999/Dumper

    【讨论】:

    • 好东西!刚刚用过,完美。
    • 这确实救了我的命,在我已经预先计算了三天然后遇到了崩溃......
    【解决方案3】:

    我不知道这是否有帮助,但您可以使用 WinDbg 的 .writemem 命令。它需要一个文件名和一个内存范围并将其(作为二进制文件)转储到磁盘。

    【讨论】:

    • 我相信WinDbg需要附加到进程,但是因为VS已经附加了它。当时只能附加一个调试器,因此无法访问 .writemem。其他方式见12
    • 你确实可以将WinDbg附加到一个已经被调试的进程上,但是你需要勾选“非侵入式”框,你会发现有些选项不可用并且你的VS进程很快就会变得没有反应。 :)
    • GDB 的命令 dump memory 也可以,但问题是专门针对 VS 的,对吧? :Ь
    【解决方案4】:

    有一个扩展名:https://marketplace.visualstudio.com/items?itemName=OvidiuIonescu.VSDebugTool。它在 VisualStudio 窗口中打开其控制台,并允许将内存转储到文件和其他一些内存操作(在控制台中输入“帮助”以获取详细信息)。

    此外,一些十六进制编辑器(例如Hex Editor Neo)可以将进程内存作为普通文件浏览。也许您也会找到具有此功能的免费编辑器。

    【讨论】:

    • 在 vs 2019 中,扩展名为 VSDebugPro(使用示例:dumpmem c:\dump.bin 0x000002257e46c00c 408942)
    【解决方案5】:

    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)
    

    【讨论】:

      【解决方案6】:

      我怀疑你可以从ClrMD 得到你想要的,然后你可以随心所欲地使用相同的数据。

      如果您真的想要一个核心转储,那么 WinDbg 可能就是您要找的吗?

      MSDN 博客上也有这篇文章:https://blogs.msdn.microsoft.com/dondu/2010/10/24/writing-minidumps-in-c/

      它描述了如何以编程方式在 .NET 中创建类似于转储的东西。

      【讨论】:

      • 我知道我可以获得所有可用内存的转储文件,但我只想在不修改源代码的情况下在调试时将内存的 sn-p 放入文件中。
      • @marsh 所以你想让我外部程序分析内存并一点一点保存?
      • @marsh 我以为你在 .NET 中工作,但你是在使用非托管内存吗?
      • 我在本地 c++ 中工作。是的,我想要一个外部程序来读取一段内存并保存它。我会给它一个起始地址和一个大小或一个起始和结束地址。虽然 Visual Studio 内存调试器窗口已经显示它,但我会这样做。
      • @marsh 一个冗长的解决方案是编写一个 VS 扩展来将该功能添加到窗口。愚蠢,它不在那里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2019-03-26
      • 2022-11-03
      • 2011-06-11
      相关资源
      最近更新 更多