Отладка Break на Win32 Api функции - PullRequest
9 голосов
/ 20 июня 2010

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

Ответы [ 2 ]

15 голосов
/ 20 июня 2010

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

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, вы должны использовать оператор контекста в точке останова.Выберите в меню: Отладка -> Новая точка останова -> Перерыв в функции, затем введите:

{,,user32.dll}_NtUserSetTimer@16
2 голосов
/ 21 июня 2010

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

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

...