Перерыв отладки на функциях Win32 Api

Я хотел бы сделать перерыв в функции SetTimer, чтобы увидеть, какие компоненты регистрируют какие таймеры с какими значениями. Возможно ли это?

2 ответов


Да, вы можете сделать это. Сначала убедитесь, что у вас есть государственные символы настройки отладчика.

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, вы должны использовать связи оператора в точке останова. Выберите в меню: Debug - > New Breakpoint - > Break at Function, затем введите:

{,,user32.dll}_NtUserSetTimer@16

вот прохождение, скриншоты, для VS2005. Обратите внимание, что для VS2008 + you не необходимо ввести украшенные имена функций (возможно, по этой причине предыдущее описание не сработало напрямую? Какова ваша платформа / IDE ?).

[Edit:] вам определенно нужны общедоступные символы MS, чтобы найти Win32 API в двоичных файлах. Самый короткий маршрут - перейти к инструментам / параметрам / отладке / символам, затем вставить 'http://msdl.microsoft.com/download/symbols ' в 'pdb locations'. Настоятельно рекомендуется - но не обязательно-установить локальный кэш для загруженных pdb (первая загрузка pdb может быть несколько минут), и для ваших нужд вы, вероятно, должны снять флажок "искать вышеуказанные местоположения только при загрузке символов вручную". При загрузке всех символов будет некоторая задержка запуска, но вам не придется преследовать user32.dll (или любая dll содержит функцию, которую вы хотите сломать) и загрузите ее pdb вручную.