6

如何查看特定进程以了解它在运行时使用了哪些资源(例如声音、图片、光标和注册表项)?

我必须使用 C# 以编程方式执行此操作(例如,使用 Windows API 或任何第三方库)。

任何帮助表示赞赏。谢谢。

4

3 回答 3

3

我会坚持性能计数器。有一些用于

  • 记忆
  • GDI 句柄(位图、字体、...)
  • 句柄(文件、注册表项、事件、互斥体、套接字、进程……)
  • 窗口(用户对象)

使用性能计数器无法确定确切的类型,但如果您泄漏某些内容,它可以为您提供提示。如果您想知道哪些句柄可以使用 SysInternals 中的句柄,这将为您提供可以解析的每个进程的良好输出。

如果要修复句柄泄漏,则需要使用调试器 (Windbbg) 并使用 !handle 扩展来开始跟踪每个句柄的所有获取/释放调用堆栈,以便稍后获得已分配但未分配句柄的统计信息还没有释放。

您的问题有点宽泛,因为确定资源泄漏的确切策略取决于泄漏的性质。EasyHook 是一个很好的解决方案,可以跟踪所有资源获取/释放调用并自动记录它们。

如果您想使用例如 C# 自动化调试器,您可以使用http://wmemoryprofiler.codeplex.com/,它基本上是 Windbg 的托管包装器,它甚至允许您自行调试您的应用程序。

当您只想了解如何获取各种资源的分散数据的原理时,您应该阅读 Process Hacker 的代码。

于 2014-02-17T23:19:30.187 回答
1

您想要 GDI 对象还是 Win32 句柄?Win32 句柄可以使用NtQuerySystemInformationWinAPI 函数获得。您可以在这些 ProcessHacker 源代码中找到与句柄相关的任务的 C# 代码:http: //sourceforge.net/p/processhacker/code/HEAD/tree/1.x/trunk/ProcessHacker.Native/Windows.cs

于 2014-02-12T05:33:37.377 回答
1

EasyHook将允许您拦截 Windows API 调用。这是一个进程进行的所有文件访问的简单示例似乎也支持注册表调用。

于 2014-02-17T12:41:54.330 回答