如何查看桌面堆上的内容

时间:2009-05-15 18:47:48

标签: winapi mfc

我有一个应用程序在这个版本中使用了大约100k以上的桌面堆,然后它做了最后一个版本。有没有办法可以看到桌面堆上的内容以及各个对象的大小?使用Dheapmon我能够看到我使用的堆的百分比,但我想要更多细节。

3 个答案:

答案 0 :(得分:1)

从博文here

的评论中被盗
  

让我   给出一些如何做的背景   进行桌面堆分配。该   桌面堆处于内核模式   虚拟地址空间,所以个人   桌面堆分配必须是   由在内核中运行的组件创建   模式。特别是,win32k.sys是   只有内核模式组件才能生成   桌面堆分配。 Win32k.sys中   在Win32的内核模式端,和   它包括窗口管理器   (USER)和GDI。这是窗口   经理使用的win32k.sys   桌面堆。的功能   窗口管理器暴露在进程中   通过用户模式运行   user32.dll中。这是user32.dll   导出用户模式可调用函数   在win32k.sys中实现。所以   如果进程没有加载user32.dll,   它不会使用桌面堆。

     

关于设置的问题   一个断点,它将捕获桌面   堆分配...是的,有这样的   功能 - win32k!DesktopAlloc 。   但是,这是一种内核模式   功能,并设置断点   它将要求您使用内核   调试器。

对于那些从未冒险离开Windows用户模式的人来说,这听起来很吓人。

当我遇到类似的问题时,我只在应用程序的启动部分放置了断点。在每次休息时,我都会看到分配的句柄级别以及dhelpmon告诉我的内容。做一些二进制搜索我开始缩小分配的位置。

答案 1 :(得分:0)

Dheapmon是我所知道的直接查看桌面堆的唯一工具,但您是否尝试使用Winspector等工具查看应用程序,以查找两个版本之间的明显差异(例如,某些类型)您的应用程序中的控件现在包含更多的窗口)?应用程序是否有机会切换到较新版本的IE?我似乎记得IE7比IE6更加桌面堆密集......

答案 2 :(得分:-2)

您可以使用Win32 API调用HeapWalk来遍历堆。如果您需要走的不仅仅是默认堆,您可以调用GetProcessHeap来获取流程可用的所有堆。