【问题标题】:Visual Studio 2010: How to print memory to a text file?Visual Studio 2010:如何将内存打印到文本文件?
【发布时间】:2014-09-08 15:00:21
【问题描述】:

我正在内存中搜索特定系列的位,但我不知道确切的地址。 Visual Studio 中有没有办法将大块内存打印到文本文件中,以便我可以搜索我正在寻找的位?

【问题讨论】:

  • 内存包含任意字节,不一定是文本。内存应该如何编码成文本?
  • 您必须记住,在 Windows 等系统中,每个进程都有自己的内存映射,因此除非您有特殊权限,否则您无法搜索其他进程的内存。
  • 但是为了帮助您解决问题,您知道output stream 可以wirte arbitrary data 吗?
  • 如果您想在特定进程的内存中搜索某些字节字符串,请考虑以下顺序:stackoverflow.com/a/10373209/179910
  • 实现自己的调试器没什么意义。只用一个真实的。像 Windbg 一样,使用“s”命令(搜索)。

标签: c++ visual-studio-2010


【解决方案1】:

以编程方式访问尚未分配给程序的内存是未定义的行为。如果您从任意位置开始读取内存,您的程序可能会崩溃。

在调试模式下,您可以在 Visual Studio 中打开内存窗口,复制内容,将其粘贴到文本编辑器中,然后保存到文本文件中以供进一步分析。从 Debug 菜单中,选择 Window / Memory / Memory 1(2、3 或 4,根据需要)。在顶部输入范围的初始地址,进行选择,然后将数据复制到剪贴板。

【讨论】:

    【解决方案2】:

    鉴于您的程序可能会在访问未定义或非法的内存区域时产生错误,以下是如何从内存打印:

      // Assign a point to point to memory.
      uint8_t const * pointer_to_memory = (uint8_t const *) /* Put address here */;
    
      // Read from memory
      uint8_t byte = *pointer_to_memory;
    
      // Output the value
      std::cout << std::hex << byte << " ";
    

    dumping内存的常见输出是:

    AAAAAAAA    BB BB BB BB BB BB BB BB   BB BB BB BB BB BB BB BB  .................
    

    地点:
    AAAAAAAA -- 内存地址(指针的内容),通常为十六进制。
    BB -- 内存字节,通常为十六进制。
    .... -- 由字节或 '.' 表示的 ASCII 字符对于不可打印的字符。

    正如其他人评论的那样,您可能需要使用操作系统 API 来读取内存的受限区域,或者您的应用程序需要以系统权限运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多