如何查看桌面堆上的内容
Posted
技术标签:
【中文标题】如何查看桌面堆上的内容【英文标题】:How can I see what is on the Desktop Heap 【发布时间】:2009-05-15 18:47:48 【问题描述】:我有一个应用程序在这个版本中使用的桌面堆比上一个版本多出大约 100k。有没有办法可以查看桌面堆上的内容以及各个对象的大小?使用 Dheapmon 我能够看到我正在使用的堆的百分比,但我想要更多详细信息。
【问题讨论】:
【参考方案1】:从博客帖子的评论中窃取here
让我 提供一点背景知识 进行桌面堆分配。这 桌面堆处于内核模式 虚拟地址空间,所以个人 桌面堆分配必须是 由在内核中运行的组件制成 模式。特别是,win32k.sys 是 只有内核模式组件 桌面堆分配。 win32k.sys 在 Win32 的内核模式方面,以及 它包括窗口管理器 (用户)和 GDI。这是窗户 使用 win32k.sys 的管理器 桌面堆。的功能 窗口管理器暴露给进程 通过在用户模式下运行 用户 32.dll。是 user32.dll 导出用户模式可调用函数 在 win32k.sys 中实现。所以 如果一个进程没有加载 user32.dll, 它不会使用桌面堆。
关于您关于设置的问题 将捕获桌面的断点 堆分配......是的,有这样的 一个函数 - win32k!DesktopAlloc。 但是,这是内核模式 函数,并设置断点 这将要求您使用 内核 调试器。
对于从未离开过 Windows 用户模式的我来说,这听起来很复杂。
当我遇到类似问题时,我只是在应用程序的启动部分放置断点。每次休息时,我都会查看分配的句柄级别以及 dhelpmon 告诉我的内容。进行一种二分搜索,我开始缩小分配发生的范围。
【讨论】:
【参考方案2】:Dheapmon 是我所知道的唯一可以直接查看桌面堆的工具,但是您是否尝试过使用 Winspector 之类的工具查看您的应用程序以查找两个版本之间的明显差异(例如,某种类型的控件在您的应用程序中现在包含更多的窗口)?应用程序是否有可能切换到更新版本的 IE?我似乎记得 IE7 比 IE6 更占用桌面堆...
【讨论】:
【参考方案3】:您可以使用 Win32 API 调用 HeapWalk 遍历堆。如果您需要遍历的不仅仅是默认堆,您可以调用GetProcessHeap 来获取进程可用的所有堆。
【讨论】:
我不太确定“桌面”堆是否可用于任何进程。我认为 dheapmon 做了一些内核模式和/或类似调试器的事情来获取它报告的信息。以上是关于如何查看桌面堆上的内容的主要内容,如果未能解决你的问题,请参考以下文章
一般用户登陆ubuntu后,如何查看root的目录?或者某个文件?