Win32 Api函数的调试中断

时间:2010-06-20 19:22:42

标签: c debugging winapi breakpoints

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

2 个答案:

答案 0 :(得分:15)

是的,你可以这样做。首先确保为调试器设置了public symbols

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

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

阿公顷!它的调试符号是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中设置断点,必须在断点中使用context operator。从菜单中选择:Debug - &gt;新断点 - &gt;在功能中断,然后输入:

{,,user32.dll}_NtUserSetTimer@16

答案 1 :(得分:2)

对于VS2005,

Here's a walkthrough, with screenshots。请注意,对于VS2008 +,你需要输入修饰的函数名称(也许这就是之前描述没有直接解决的原因?你的平台/ IDE是什么?)。

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