【问题标题】:I want to determine how much memory is used by dynamically-linked libraries我想确定动态链接库使用了多少内存
【发布时间】:2012-02-10 11:15:56
【问题描述】:

我想找出哪些库使用的内存最多。我想在我的应用程序中制作一种内存记录器。这需要以编程方式查找自己的进程中哪些库使用了多少内存。

例如,我有一个使用 10MB 内存的程序,其中有一个使用 9MB 内存的 .dll。我想查看所有的 dll 以及它们使用了多少内存。 此应用程序将在 Windows 上运行。一切都需要以编程方式完成。

【问题讨论】:

  • 只是 DLL 本身还是包括它们分配的所有动态内存?
  • 包括他们分配的所有动态内存
  • 除非有理由自己编写代码,否则您至少应该查看code.google.com/p/gperftools/wiki/GooglePerformanceTools 的堆分析器。它在 UNIX 方面几乎可以满足您的需求,而且还具有(我未经测试的)Windows 支持。如果不出意外,这是获得一些想法的好起点。
  • DLL 不拥有内存。进程可以。

标签: c++ windows memory dll


【解决方案1】:

不确定这是否是最简单的方法,但也许您应该在加载每个库后立即挂钩内存分配 WinAPI 函数。 然后在你的钩子中,你将能够进行必要的计数 看看 Microsoft Detours 库作为一个很好的挂钩框架 (http://research.microsoft.com/en-us/projects/detours/)。它通常不是免费的,但可以免费“用于研究、非商业和非生产用途”

要挂钩的实际函数实际上取决于需要跟踪的 dll。

如果它们都是用动态链接的 MSVC 运行时编译的,则必须挂钩 malloc() / free() / calloc() / realloc() 系列函数。 如果它与运行时静态链接,或者未使用 MS VC 编译,则必须挂钩与内存相关的 WinAPI 调用,例如 HeapAlloc / HeapCreate / HeapDestroy / HeapFree / heapReAlloc / VirtualAlloc / VirtualFree(我只是寻找与内存相关的msvcr100.dll 从 kernel32.dll 导入的函数)

【讨论】:

  • 我知道如何钩住东西,我以前做过。但是我怎样才能找到我需要的功能呢?那么什么函数处理 DLL 和它们的内存呢?
猜你喜欢
  • 2012-02-29
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2018-05-02
  • 2013-02-23
  • 2016-07-07
  • 2012-01-12
相关资源
最近更新 更多