Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是事件句柄?_C_Visual Studio 2008_Windows Xp - Fatal编程技术网

C 什么是事件句柄?

C 什么是事件句柄?,c,visual-studio-2008,windows-xp,C,Visual Studio 2008,Windows Xp,我在一个大的旧程序中有一个句柄泄漏。使用sysinternals handle.exe,我推断泄漏的句柄类型是“事件”句柄。但我不确定我的代码应该看哪些部分。是否有返回事件句柄的函数列表 编辑:整个程序中没有一个CreateEvent、CreateEventEx或OpenEvent实例。据我所知,几乎只有CreateEvent和CreateEventEx创建了事件。许多其他函数可以返回事件的句柄(例如WaitForMultipleObjects),但它是您以前创建并传递给它的句柄 编辑:由于您的

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


编辑:整个程序中没有一个CreateEvent、CreateEventEx或OpenEvent实例。

据我所知,几乎只有CreateEvent和CreateEventEx创建了事件。许多其他函数可以返回事件的句柄(例如WaitForMultipleObjects),但它是您以前创建并传递给它的句柄


编辑:由于您的代码显然不是直接创建事件的,因此您可能希望先使用迂回来查看对CreateEvent(Ex)的调用,并追溯堆栈,以查看代码的哪些部分导致了这些调用的创建,以及创建这些调用的是什么。

下面的链接应该让您开始:


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

正如其他人所提到的,CreateEvent/CreateEventEx用于创建“事件”句柄。这些表示经常用于选通访问、向其他线程(可能)提供信号以及也可以用作锁的基础的同步对象

如果试图调试涉及事件句柄的泄漏,则应尝试查找调用CreateEvent(Ex)时没有相应CloseHandle()的位置。根据您用来获取事件的框架,您还可能会发现,如果它们是另一个对象/结构的成员(例如,具有在清理时跳过的通用句柄成员变量或指向句柄的指针等),则在清理时可能会丢失它们

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

创建事件句柄

清理句柄

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

(免费)


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

即使您自己不直接创建事件,操作系统或其他库代码也肯定能够并且将会。您可能希望查看应用程序正在打开/创建的其他资源是否未被清理。有可能你真的泄漏了其他东西,但那东西带来了一个事件对象


在CreateEvent(和friends)上设置调试器断点可能会有所帮助,以查看是什么在创建它,但如果这种情况经常发生,以至于您的问题在噪音中消失,我也不会感到惊讶。

您看到了多少泄漏的句柄

事件由关键部分(参见等人)隐式创建,可能还有一些我现在记不起来的Win32元素。此外,它们可以由您正在使用的框架(如果有)创建,如MFC,也可以由您正在使用的库创建


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

在最初的混乱之后,程序将稳定下来,每秒产生一到两个泄漏。-这个答案听起来很可行,但我要到明天才能尝试。干杯