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?
Respuesta
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.
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
- 1. Evitar que Visual Studio se rompa al lanzar excepciones
- 2. Evitar que VS C# Unit Testing se rompa con las excepciones
- 3. ¿Cómo evitar que se desinstale una aplicación?
- 4. aplicación no se inicia en el depurador
- 5. ¿Cómo puedo evitar que el movimiento rápido del mouse rompa una línea en mi aplicación de dibujo?
- 6. ¿Hay alguna manera de hacer que el depurador de script google chrome se rompa en la excepción?
- 7. Esperando que el reproductor flash se conecte al depurador
- 8. ¿Cómo hacer que un fragmento de texto no se rompa?
- 9. ¿Cómo puedo hacer que Visual Studio se rompa justo antes de que se detenga el programa?
- 10. Haciendo que Firebug se rompa dentro de javascript cargado dinámicamente
- 11. Delphi2007: bloqueo al continuar la aplicación detenida en el depurador
- 12. ¿Cómo configuro un programa para que se inicie al inicio?
- 13. Windows 7: evitar que la aplicación pierda el foco
- 14. ¿Cómo se puede acceder al depurador desde el código fuente de Python?
- 15. onNavigationItemSelected en ActionBar se llama al inicio ¿cómo se puede evitar?
- 16. node.js, detectando errores para que el script no se rompa?
- 17. Evitar que el explorador de soluciones se oculte al depurar
- 18. ¿Cómo decirle al depurador de LLDB que no maneje SIGBUS?
- 19. Evitar que tomcat inicie la aplicación al implementar
- 20. ¿Cómo se actualiza una aplicación de inicio?
- 21. Evitar que el depurador se detenga en una excepción en una LambdaExpression compilada
- 22. Evitar el inicio de la aplicación Java EE en WebSphere en la excepción
- 23. Depurador Lua que se puede conectar al proceso
- 24. Cómo evitar que un HttpUnauthorizedResult (401) se redirija al controlador de inicio de sesión en mi punto final Api
- 25. ¿Cómo evitar que una aplicación se fije en Windows 7?
- 26. ¿Cómo evitar que se cargue una aplicación WPF?
- 27. ¿Cómo hacer que Firebug rompa con la excepción?
- 28. ¿Cómo evitar que fullcalendar muestre la hora de inicio en el título del evento?
- 29. La aplicación web iPad se congela en el Inicio
- 30. ¿Cómo averiguo qué DLL falta hace que mi aplicación .NET se cuelgue al inicio?
¡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. –
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í? –
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