2010-06-20 18 views

Respuesta

15

Sí, puedes hacer esto. Primero asegúrese de tener la configuración public symbols para su depurador.

SetTimer vive en user32 pero eso es exactamente como se exporta. La forma más fácil de hacerlo es con el depurador de línea de comandos, NTSD. Necesitamos su nombre real, a fin de buscar símbolos en user32 ese partido:

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> 

Ah-ha! Su símbolo de depuración es NtUserSetTimer:

0:000> bp user32!NtUserSetTimer 

En Visual Studio, puede averiguar dónde SetTimer vive por escribiendo un programa simple rasguño, y luego poner un punto de interrupción y hacer clic derecho y seleccionar "Ir al desmontaje":

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 [[email protected] (418338h)] 

Si damos un paso en esa llamada, después de aterrizar aquí:

[email protected]: 
759977D5 mov   eax,123Dh 
759977DA mov   edx,7FFE0300h 
759977DF call  dword ptr [edx] 
759977E1 ret   10h 

Así que el de poner un breakpoint allí en Visual Studio, usted tiene que utilizar la context operator en el punto de interrupción. Seleccione de los menús: Depuración -> Nuevo punto de interrupción -> Rotura en la función, a continuación, introduzca:

{,,user32.dll}[email protected] 
+0

No sabía que es posible establecer puntos de interrupción mediante comandos. Nunca he usado esta característica. ¿Dónde ingreso la cadena que me proporcionó? – ronag

+0

El primero es para el depurador de línea de comandos: http://www.microsoft.com/whdc/devtools/debugging/default.mspx –

+0

Gran respuesta. Gracias. – ronag

2

Here's a walkthrough, with screenshots, para VS2005. Tenga en cuenta que para VS2008 + usted no necesita ingresar los nombres de las funciones decoradas (¿quizás esa sea la razón por la cual la descripción anterior no funcionó directamente? ¿Cuál es su plataforma/IDE?).

[Editar:] Definitivamente necesita símbolos públicos de MS para poder ubicar la API Win32 en binarios. La ruta más corta es ir a Herramientas/Opciones/Depuración/Símbolos, luego pegue 'http://msdl.microsoft.com/download/symbols' en 'ubicaciones de pdb'. Se recomienda encarecidamente, aunque no necesariamente, establecer un caché local para los pdb descargados (las primeras cargas de pdb pueden durar unos minutos) y, para sus necesidades, probablemente debería desmarcar 'Buscar en las ubicaciones anteriores solo cuando los símbolos se carguen manualmente'. Habrá un retraso en el inicio ya que todos los símbolos están cargados, pero no tendrá que buscar user32.dll (o lo que sea que contenga la función que desea interrumpir) y cargar su pdb manualmente.

+0

Windows XP, VS2010 Pro – ronag

+0

Luego puede probar {,, user32.dll} NtUserSetTimer o {,, user32.dll} SetTimer. –

+0

sigue sin éxito – ronag

Cuestiones relacionadas