Win32 Api函数的调试中断

ron*_*nag 9 c debugging winapi breakpoints

我想在SetTimer函数上休息一下,看看哪些组件用什么值注册了哪些定时器.这可能吗?

i_a*_*orf 16

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

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>
Run Code Online (Sandbox Code Playgroud)

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

0:000> bp user32!NtUserSetTimer
Run Code Online (Sandbox Code Playgroud)

在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)] 
Run Code Online (Sandbox Code Playgroud)

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

_NtUserSetTimer@16:
759977D5  mov         eax,123Dh 
759977DA  mov         edx,7FFE0300h 
759977DF  call        dword ptr [edx] 
759977E1  ret         10h  
Run Code Online (Sandbox Code Playgroud)

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

{,,user32.dll}_NtUserSetTimer@16
Run Code Online (Sandbox Code Playgroud)

  • 是的,转到关于公共符号的第一个链接.将"http:// msdl.microsoft.com/download/symbols"添加到工具 - >选项 - >调试 - >符号列表中.您可能需要检查"仅手动加载"框以防止VS始终运行速度非常慢.然后,右键单击模块窗口中的user32.dll(或其他),选择"加载符号". (2认同)