如果设置或不设置 windows 事件对象,如何调试?
How to debug if windows event object is set or not?
使用 visual studio 调试器时,我得到了 windows 事件同步对象的句柄值。是否可以告诉(最好设置一个手表)显示事件是否已设置?
使用 Visual Studio 调试器是不可能的。 WinDbg, on the other hand, offers the !handle extension command. Passing a 0xf
UMFlags shows extensive information, including whether the event object is signaled. While it is possible to use WinDbg from Visual Studio,我觉得这样做有点乏味。
另一个值得考虑的选项是在 ntdll.dll!NtSetEvent
上设置断点 (Debug -> New Breakpoint -> 函数中断...)。添加条件(右击断点 -> Condition...)@rax == <handle value>
只会中断,如果参数是特定的 <handle value>
您感兴趣。这是针对 64 位版本的。对于 32 位版本,条件为 *((unsigned int*)(@esp+4)) == <handle value>
.
如上所述设置断点有一个 - 可能很重要 - 限制:如果事件对象是从用户模式代码设置的,它只会被命中。如果事件对象在为用户模式请求提供服务时从内核模式收到信号,则不会命中位于用户空间的断点。
可能跑题了;如果您有到目标的内核调试器连接,您可以检查事件的 DISPATCHER_HEADER::SignalState。非零可能意味着发出信号。为什么只有可能?因为没有记录。
使用 visual studio 调试器时,我得到了 windows 事件同步对象的句柄值。是否可以告诉(最好设置一个手表)显示事件是否已设置?
使用 Visual Studio 调试器是不可能的。 WinDbg, on the other hand, offers the !handle extension command. Passing a 0xf
UMFlags shows extensive information, including whether the event object is signaled. While it is possible to use WinDbg from Visual Studio,我觉得这样做有点乏味。
另一个值得考虑的选项是在 ntdll.dll!NtSetEvent
上设置断点 (Debug -> New Breakpoint -> 函数中断...)。添加条件(右击断点 -> Condition...)@rax == <handle value>
只会中断,如果参数是特定的 <handle value>
您感兴趣。这是针对 64 位版本的。对于 32 位版本,条件为 *((unsigned int*)(@esp+4)) == <handle value>
.
如上所述设置断点有一个 - 可能很重要 - 限制:如果事件对象是从用户模式代码设置的,它只会被命中。如果事件对象在为用户模式请求提供服务时从内核模式收到信号,则不会命中位于用户空间的断点。
可能跑题了;如果您有到目标的内核调试器连接,您可以检查事件的 DISPATCHER_HEADER::SignalState。非零可能意味着发出信号。为什么只有可能?因为没有记录。