2012-01-05 16 views
12

Actualmente estoy implementando la última tarea para un pequeño marco de depuración, concretamente HW Breakpoints. Me referí a este artículo hasta ahora: http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx y un libro sobre cómo escribir un depurador.Hardwarebreakpoint WINAPI

llegué siguientes dos funciones hasta ahora para establecer un punto de interrupción HW:

void debuglib::breakpoints::hw_bp() { 
    HANDLE helper = 0; 

    CONTEXT co; 
    CURRENTCONTEXT(co); 

    helper = ::CreateThread(0,0,threadfunc,reinterpret_cast<void*>(co.Eip),0,0); 

    DWORD status = ::WaitForSingleObject(helper,INFINITE); 


    if (status != WAIT_OBJECT_0) { 
      ::MessageBoxA(0, "Helper thread didn't exit cleanly", "HWBreakpoint", MB_OK); 
    } 

    ::CloseHandle(helper); 
} 

static DWORD WINAPI debuglib::breakpoints::threadfunc(void* param) { 

    DWORD suspendcnt = ::SuspendThread(debuglib::process::thread()); 
    if(suspendcnt) { 
     return 0; 
    } 

    CONTEXT co; 
    ::ZeroMemory(&co,sizeof(co)); 
    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 

    BOOL ok = ::GetThreadContext(debuglib::process::thread(),&co); 

    if(!ok) { 
     return 0; 
    } 

    DWORD freeDr = 0; 
    DWORD condition = debuglib::breakpoints::TRIGGER::CODE; 
    DWORD length = debuglib::breakpoints::SIZE::SIZE_1; 

    co.Dr0 = reinterpret_cast<DWORD>(param); 

    co.Dr7 = co.Dr7 | 1 << (freeDr*2); 
    co.Dr7 = co.Dr7 | condition << ((freeDr*4)+16); 
    co.Dr7 = co.Dr7 | length << ((freeDr*4)+18); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ok = ::SetThreadContext(debuglib::process::thread(), &co); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ::GetThreadContext(debuglib::process::thread(),&co); 

    suspendcnt = ::ResumeThread(debuglib::process::thread()); 
    if(suspendcnt == 0xFFFFFFFF) { 
     return 0; 
    } 

    return 1; 
} 

Así que primero estoy creando un hilo ayudante ya estoy depurar el hilo actual. Dentro de la función de devolución de llamada del hilo auxiliar, estoy suspendiendo el hilo principal. Luego leo los valores actuales de DR del hilo principal (en este momento no es relevante, ya que siempre uso DR0, después de esto funciona, comprobaré qué registros son libres y uso hasta 4 BP). Después utilicé la dirección de retorno de la función de llamada (EIP) como dirección para dividir DR0 y establecer los indicadores de pertenencia en DR7.

Al final estoy reanudando el hilo principal y cerrando el mango del hilo auxiliar, ya que está terminado.

Con este código Me siguiente problema:

Si ejecuto el programa en modo de depuración de los programas esté detenida en la dirección correcta, pero no pueden hacer nada más, ya que la bandera INT1 se establece que supongo y el VS depurador no puede dar un paso más allá?

Si ejecuto el programa sin depurarlo, se produce un bloqueo simple. Traté de usar __try, __ excepto en el proyecto mencionado (http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx) pero esto tampoco funciona.

Agradezco y ayudo o información lo que estoy haciendo mal y cómo resolver este problema.

+0

¿Podría decirme cuál es el nombre del libro que está usando? También estoy interesado en desarrollar un depurador de hw. –

+2

Se llama "Hackear con Python", pero está escrito en alemán (http://www.amazon.de/Hacking-mit-Python-Fehlersuche-Programmanalyse/dp/3898646335/ref=sr_1_1?ie=UTF8&qid= 1325766641 & sr = 8-1). – Chris

+0

Gracias, intentaré encontrar algo en inglés del mismo autor. –

Respuesta

1

No creo que sea una buena idea intentar hacer una depuración de programa. ¿Por qué no utilizar la API de desarrollo de depuración integrada en Windows?

Dev Center - Escritorio> Aprender> Referencia> Diagnóstico> Depuración y tratamiento de errores> básicos de la depuración> Depuración> Referencia de funciones de depuración: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs.85%29.aspx

En el hardware x86, de un solo paso a paso se habilita estableciendo el indicador trampa eflags. La CPU generará una excepción de punto de interrupción después de completar una instrucción. Lo que creo que está sucediendo es que el depurador del estudio visual está cambiando esa parte de las banderas, interfiriendo con lo que estás tratando de hacer.

Intenta ejecutar tu programa fuera de Visual Studio (sin depurador). ¿Funciona como se esperaba entonces?

Cuestiones relacionadas