什么是事件处理?

时间:2009-11-17 17:30:42

标签: c visual-studio-2008 windows-xp

我在一个大的旧程序中有一个句柄泄漏。使用sysinternals handle.exe我推断出泄漏的句柄类型是一个“事件”句柄。但是我不确定我应该看看我的代码的哪些部分。是否有一个返回事件句柄的函数列表?

编辑:整个程序中没有CreateEvent,CreateEventEx或OpenEvent的单个实例。

6 个答案:

答案 0 :(得分:2)

你看到这些泄漏的手柄有多少?

事件是由关键部分隐含创建的(参见InitializeCriticalSection et.al.),可能还有其他一些我目前无法记住的Win32元素。此外,它们可以由您正在使用的框架(如果有)(如MFC)或您正在使用的库创建。

要跟踪泄漏,您可以使用仅打印断点。进入CreateEvent函数(使用程序集视图)并在其第一条指令上放置一个断点。然后右键单击断点,选择“When Hit ...”并编辑选项,这样它就不会进入调试器,但会打印一些有用的信息(例如,参见$ CALLER宏)。然后运行你的应用程序......并准备好看到一个巨大的日志。如果存在真正的泄漏,您将在日志中看到重复模式,用于识别违规者。

答案 1 :(得分:1)

正如其他人提到的,CreateEvent / CreateEventEx用于创建“事件”句柄。它们代表经常用于门禁访问的同步对象,可能(可能)向其他线程提供信号,也可以用作锁定的基础。

如果您正在尝试调试涉及事件句柄的泄漏,您应该尝试在没有相应的CloseHandle()的情况下查找调用CreateEvent(Ex)的位置。根据您用于获取事件的框架,如果它们是另一个对象/结构的成员(例如,具有在清理时跳过的泛型HANDLE成员变量的某些内容),您可能还会发现在清理时可能只是缺少它们。指向HANDLE的指针等。)

如果您不记得在自己的代码中创建了这些对象,则可能在内部使用它们的另一个类或提供程序上缺少类似的Close()或其他清理方法。做后台处理,发信号或提供等待操作完成的方法的事情是这里常见的嫌疑人。

创建事件句柄
CreateEvent Function @ MSDN
CreateEventEx Function @ MSDN

清理手柄
CloseHandle Function @ MSDN

答案 2 :(得分:1)

如果您不知道哪些DLL或第三方组件正在调用CreateEvent或CreateEventEx,请使用Dependency Walker查看每个DLL导入的内容:

http://www.dependencywalker.com/(免费)

这至少有助于将问题缩小到一组特定的交互 - 然后你需要查看对该库的所有调用,并检查是否所有内容都已正确清理。

答案 3 :(得分:1)

即使您不直接自己创建事件,操作系统或其他库代码当然也可以。您可能希望查看应用程序正在打开/创建的某些其他资源可能未被清除的可能性。你可能正在泄漏其他东西,但那件事就是带来一个事件对象。

在CreateEvent(和朋友)上设置一个调试器断点可能会有所帮助,看看是什么创建了它,但如果经常发生这种情况,你的问题会在噪音中丢失,我不会感到惊讶。

答案 4 :(得分:0)

据我所知,创建事件的唯一事情几乎是CreateEvent和CreateEventEx。相当多的其他函数可以返回事件的句柄(例如WaitForMultipleObjects),但它是您之前创建并传递给它的句柄..

编辑:由于您的代码显然没有直接创建事件,您可能希望首先使用绕道来查看对CreateEvent(Ex)的调用,并追溯堆栈以查看代码的哪个部分导致它们要创建,以及它正在创建它们的内容。

答案 5 :(得分:0)

以下链接可以帮助您入门: http://msdn.microsoft.com/en-us/library/ms682655(VS.85).aspx

CreateEvent和CreateEventEx将创建事件并向它们返回句柄。

相关问题