Перерыв отладки на функциях 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 вручную.