Win32 Api函数的调试中断

我想在SetTimer函数上rest一下,看看哪些组件使用什么值来记录哪些计时器。 这可能吗?

是的,你可以这样做。 首先确保为调试器设置了公共符号 。

SetTimer位于user32中,但这就是它导出的内容。 最简单的方法是使用命令行调试器NTSD 。 我们需要它的真实名称,所以在user32中查找匹配的符号:

0:000> x user32!*timer* 759992b9 USER32!NtUserValidateTimerCallback =  759977d5 USER32!NtUserSetTimer =  759e4f13 USER32!NtUserSetSystemTimer =  759993bf USER32!NtUserKillTimer =  

啊,哈! 它的调试符号是NtUserSetTimer:

 0:000> bp user32!NtUserSetTimer 

在Visual Studio中,您可以通过编写一个简单的临时程序,然后设置断点并右键单击并选择“转到反汇编”来确定SetTimer的位置:

 int _tmain(int argc, _TCHAR* argv[]) { SetTimer(NULL, 0, 0, NULL); 004113BE mov esi,esp 004113C0 push 0 004113C2 push 0 004113C4 push 0 004113C6 push 0 004113C8 call dword ptr [__imp__SetTimer@16 (418338h)] 

如果我们进入那个电话,那么我们就在这里:

 _NtUserSetTimer@16: 759977D5 mov eax,123Dh 759977DA mov edx,7FFE0300h 759977DF call dword ptr [edx] 759977E1 ret 10h 

因此,要在Visual Studio中设置断点,您必须在断点中使用上下文运算符 。 从菜单中选择:Debug – > New Breakpoint – > Break at Function,然后输入:

 {,,user32.dll}_NtUserSetTimer@16 

这是 VS2005的截图 , 有截图 。 请注意,对于VS2008 +,您不需要输入修饰的函数名称(也许这就是之前描述没有直接解决的原因?您的平台/ IDE是什么?)。

[编辑:]您肯定需要公共MS符号才能在二进制文件中找到Win32 API。 最短的路线是工具/选项/调试/符号,然后将“ http://msdl.microsoft.com/download/symbols ”粘贴到“pdb位置”。 强烈建议 – 但不是必须 – 为下载的pdb设置本地缓存(第一次pdb加载可能需要几分钟),根据您的需要,您可能应该取消选中“仅在手动加载符号时搜索上述位置”。 加载所有符号时会有一些启动延迟,但您不必追逐user32.dll(或任何dll保存您希望中断的function)并手动加载其pdb。