2011-08-10 8 views
26

No estoy seguro de cuántos usuarios hay por ahí que usan el compilador LCC C y la GUI WEdit para Windows, pero tiene una "característica" que puede llegar a ser bastante molesta. Cuando inicia una aplicación con el depurador, rompe la aplicación al inicio de la función Principal. ¿Cómo puedo cortar esto para que el depurador ejecute inmediatamente el código hasta que lo detenga o llegue a un punto de interrupción que he creado?LCC-- ¿Cómo evitar que el depurador se rompa al inicio de la aplicación?

+0

¡Buena pregunta! He usado LCC-Win32 en el pasado para enseñar C, y para los novatos esta es una buena característica, pero puedo ver cómo puede ser molesto. Intenté configurar y desarmar un punto de interrupción en el corchete de apertura en main() pero de cualquier forma se detiene allí. Miré los parámetros de línea de comandos de Wedit (el IDE para LCC-Win32) pero no hay indicadores que controlan lo que hace al inicio. –

+0

No estoy familiarizado con LCC, pero a partir de la documentación del usuario: "Puede ver todos los puntos de interrupción que tiene y editarlos/eliminarlos eligiendo del menú Compilador-> Puntos de interrupción (o Depurar-> Editar puntos de interrupción)". ¿Viste punto de interrupción en main() aquí? –

+0

No hay punto de interrupción. La molestia es independientemente de si se establece un punto de interrupción, o no, el depurador/editor siempre se rompe en la primera línea del método main(). – RLH

Respuesta

6

Guau, la gente todavía usa LCC ... La última vez que lo usé fue hace ~ 10 años.

Descompuse wedit.exe y puedo confirmar que no hay manera oficial de deshabilitar este comportamiento.

He parcheado el binario si eso funciona para usted. Lo cargué here.

Para aquellos que preocupados por los virus y tal remendé wedit tomado de here. Sobre la caja dice que es la versión 4.0 compilado en Sep 16 2009.

Aquí está la función parcheado a los que interesa:

int __cdecl sub_44CF0D(HANDLE hProcess) 
{ 
    int result; // [email protected] 
    int v2; // [email protected] 
    int v3; // [email protected] 
    int v4; // [email protected] 
    int v5; // [email protected] 
    int v6; // [sp+10h] [bp-68h]@11 
    int v7; // [sp+14h] [bp-64h]@1 
    struct _DEBUG_EVENT DebugEvent; // [sp+18h] [bp-60h]@1 

    v7 = 1; 
    result = WaitForDebugEvent(&DebugEvent, dwMilliseconds); 
    if (result) 
    { 
    sub_44C67A(&DebugEvent); 
    if (DebugEvent.dwDebugEventCode == 1) 
    { 
     if (DebugEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION 
     && !(dword_482860 & 1) 
     && !dword_484328 
     && DebugEvent.u.Exception.dwFirstChance) 
     { 
     sub_44E1A5(0); 
     sub_44CEB2(v2); 
     return ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x80010001u); 
     } 
     v6 = 0; 
     v7 = sub_44D2C4((int)&DebugEvent, hProcess, (int)&v6); 
     if (v6 && DebugEvent.u.Exception.dwFirstChance) 
     return ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x80010001u); 
     goto LABEL_41; 
    } 
    if (DebugEvent.dwDebugEventCode == 3) 
    { 
     if (dword_483C94) 
     { 
     dword_48428C = 1; 
LABEL_41: 
     if (dword_483C6C) 
      sub_44ECDC(); 
     if (v7) 
     { 
      result = ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u); 
     } 
     else 
     { 
      dword_49BF68 = 1; 
      ResetEvent(dword_484AE4); 
      dword_4843C8 = DebugEvent.dwThreadId; 
      result = sub_4524CD(); 
     } 
     return result; 
     } 
     Sleep(0x32u); 
     dword_49BF64 = 1; 
     dword_49BF68 = 1; 
     qword_483C74 = __PAIR__(
         (unsigned int)DebugEvent.u.Exception.ExceptionRecord.ExceptionAddress, 
         DebugEvent.u.Exception.ExceptionRecord.ExceptionInformation[2]); 
     if (dword_484288) 
     ::hProcess = (HANDLE)DebugEvent.u.Exception.ExceptionRecord.ExceptionFlags; 
     else 
     ::hProcess = hProcess; 
     dword_483C84 = DebugEvent.dwProcessId; 
     hThread = DebugEvent.u.Exception.ExceptionRecord.ExceptionRecord; 
     dword_483C9C = (HANDLE)DebugEvent.u.Exception.ExceptionRecord.ExceptionCode; 
     dwThreadId = DebugEvent.dwThreadId; 
     dword_483C94 = 0; 
     if (sub_45A83A()) 
     { 
     v4 = sub_4026A6(28); 
     dword_484330 = v4; 
     *(_DWORD *)(v4 + 4) = hThread; 
     *(_DWORD *)(v4 + 8) = dwThreadId; 
     if (dword_484288) 
     { 
      sub_455B58(); 
     } 
     else 
     { 
      Sleep(0x64u); 
      v5 = sub_45AAFC(); 
      if (!v5) 
      return PostMessageA(dword_4849EC, 0x111u, 0x64u, 0); 
      if (dword_484354) 
      goto LABEL_50; 
      sub_455B58(); 
      if (dword_483C70 && *(_DWORD *)(dword_483C70 + 52)) 
      *(_DWORD *)(*(_DWORD *)(dword_483C70 + 52) + 36) = sub_451577(**(_DWORD **)(dword_483C70 + 52), 1u); 
      v5 = *(_DWORD *)(dword_483C70 + 52); 
      if (v5 && *(_DWORD *)(v5 + 36)) 
      { 
LABEL_50: 
      if (!dword_483C6C) 
       sub_44E92A(v5); 
      sub_44CC3D(); 
      sub_451600(); 
      PostMessageA(dword_4849EC, 0x111u, 0x154u, 0); 
      } 
      else 
      { 
      sub_4029CA("Imposible to find %s\nRunning without source display", *(_DWORD *)(dword_483C70 + 20)); 
      dword_484344 = 1; 
      v7 = 1; 
      PostMessageA(dword_4849EC, 0x111u, 0x154u, 0); 
      } 
     } 
     goto LABEL_41; 
     } 
     dword_484338 = 1; 
     v3 = sub_44DB56(qword_483C74); 
     if (v3) 
     *(_BYTE *)(v3 + 29) &= 0xFDu; 
     result = ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u); 
    } 
    else 
    { 
     if (DebugEvent.dwDebugEventCode != 5) 
     goto LABEL_41; 
     if (DebugEvent.dwProcessId != dword_483C84) 
     { 
     v7 = 1; 
     goto LABEL_41; 
     } 
     dword_49BF64 = 0; 
     dword_49BF68 = 1; 
     dword_481614 = 0; 
     result = sub_402A32(4520, SLOBYTE(DebugEvent.u.Exception.ExceptionRecord.ExceptionCode)); 
     if (!dword_483C6C) 
     result = sub_40B155(lpCmdLine); 
    } 
    } 
    else 
    { 
    if (dword_483C6C) 
     result = sub_44ECDC(); 
    } 
    return result; 
} 

if bajo LABEL_50 es lo remendé (de 0x75 a 0xEB).

Era fácil detectar el lugar porque esperaba que WriteProcessMemory se utilizara para escribir 0xCC en el punto de entrada de la aplicación que se está depurando.

+1

Bueno, quería esperar un tiempo antes de marcar esto como la respuesta, por si acaso se proporcionara alguna otra solución. Esto ciertamente resuelve el problema, pero no tan elegantemente como esperaba. Gracias por la solución! – RLH

Cuestiones relacionadas