如果设置了 Windows 事件对象,如何调试?

Posted

技术标签:

【中文标题】如果设置了 Windows 事件对象,如何调试?【英文标题】:How to debug if windows event object is set or not? 【发布时间】:2015-03-19 21:51:00 【问题描述】:

当使用 Visual Studio 调试器时,我得到了一个 HANDLE 的值到一个 Windows 事件同步对象。是否可以告诉(最好设置一个手表)来显示事件是否设置?

【问题讨论】:

【参考方案1】:

使用 Visual Studio 调试器无法做到这一点。另一方面,WinDbg 提供了!handle 扩展命令。传递0xf UMFlags 会显示大量信息,包括事件对象是否已发出信号。虽然可以use WinDbg from Visual Studio,但我觉得这样做有点乏味。

另一个值得考虑的选项是在ntdll.dll!NtSetEvent 上设置断点(Debug -> New Breakpoint -> Break at Function... )。添加条件(右键单击断点 -> Condition...@rax == <handle value> 只会中断,如果参数是您感兴趣的特定 <handle value>。这个适用于 64 位构建。对于 32 位构建,条件为 *((unsigned int*)(@esp+4)) == <handle value>

如上所述设置断点有一个可能很重要的限制:如果事件对象是从用户模式代码设置的,它只会被命中。如果事件对象在为用户模式请求提供服务时从内核模式收到信号,则不会命中驻留在用户空间中的断点。

【讨论】:

【参考方案2】:

可能跑题了;如果你有一个到目标的内核调试器连接,你可以检查事件的 DISPATCHER_HEADER::SignalState。非零可能意味着已发出信号。为什么只有可能?因为它没有记录在案。

【讨论】:

以上是关于如果设置了 Windows 事件对象,如何调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中检测 Windows 事件?

如何在winform窗体加载完以后再执行某个事

如何编写一个简单的调试器?

windows server 2003 怎样去掉关机事必须选择的计划非计划选项?

windows程序崩溃调试终极武器

调试事件的发送流程