【问题标题】:.NET View Other Application's Memory.NET 查看其他应用程序的内存
【发布时间】:2012-06-05 18:49:39
【问题描述】:

所以我有两个可以协同工作的应用程序。一种是使用自定义内存管理器用本机 C++ 编写的。此内存管理器管理从起始地址到 startAddress + size 的连续字节块。我还有一个 WPF 应用程序,它读取文本文件(只是内存管理器中的字节倒入文本文件)并显示有关它的各种统计信息。我想知道是否有一种方法可以在 WPF 应用程序中实时查看本机 c++ 应用程序的内存。所以一些伪逻辑可能是:

  • 本机应用程序可能会以某种方式公开池的起始地址和大小
  • WPF 应用程序获取从该起始地址到起始地址加上大小的所有字节

我已经探索了 .NET 中的 Process 类,但我没有看到任何类似 MemoryPool 的东西,而且我认为该对象的 StartAddress 指向应用程序的 very 开头,而不是第一个已分配堆。

这里的任何帮助将不胜感激!

【问题讨论】:

  • 本机代码正在使用的内存块有什么特殊/特定的吗?是否可以将其更改为针对内存映射文件工作?
  • 您也可以 PInvoke ReadProcessMemory。我不知道有这样的托管 API。
  • 您需要查看其他进程的全部内存,还是只需要能够共享一块内存?
  • 我只需要查看本机应用程序内存的特定块。我不知道是否有 PInvoke 的托管等效项。不幸的是,本机应用程序无法写入文件,因为它是实时运行的。我希望托管应用程序“附加”到流程中。
  • 如果这仍然是一个问题 - 不要被内存映射文件的名称所拖延 - 它们可以是由页面文件支持的内存块,就像任何其他部分一样您的进程的内存。如果你想要的话,这里是unmanaged sidemanaged side,可以从中拼凑出一个解决方案。

标签: c++ .net wpf memory memory-management


【解决方案1】:

cmets 中的 Damien_The_Unbeliever 发布了不可避免的最佳解决方案。我很抱歉没有早点发布这个,以防其他人遇到这个问题。这个想法是使用memory mapped files 使一块内存在您的应用程序之外可见。本质上,您创建一个内存块并为其指定一个字符串名称(标识符)。任何其他知道此标识符的应用程序都可以读取该内存块,就好像它是他们自己的一样(假设他们正在使用内存映射文件来查看内存,因为它不仅仅是本质上可见的)。需要注意的是,读取内存的应用程序必须能够解析内存并理解它。

我用它在 C# 中为我的引擎创建了一个实时内存查看器。该引擎有一个底层分配器和内存管理器,它现在写入一个内存块,该内存块也由内存映射文件指向。 C# 应用程序以给定的时间间隔读取此内存,并以相关的方式将其显示给用户(开发人员)。最好的部分是,因为原生端根本不需要改变来使用这个实现,这根本不会影响应用程序的性能。

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 2011-08-26
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2016-08-16
    相关资源
    最近更新 更多