我有一个应用程序在这个版本中使用了大约100k以上的桌面堆,然后它做了最后一个版本。有没有办法可以看到桌面堆上的内容以及各个对象的大小?使用Dheapmon我能够看到我使用的堆的百分比,但我想要更多细节。
答案 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来获取流程可用的所有堆。