Código de servidor de socket de depuración

Estoy tratando de recorrer el código de un programa que no escribí (tengo la fuente). Es un pequeño servidor http. Puedo colocar puntos de interrupción y se respetarán en cualquier punto que se ejecute en una ruta lineal desde el main(). Sin embargo, cuando trato de colocar un punto de interrupción en una línea que se llama en respuesta a una conexión desde el navegador, simplemente se ignora.

¿Hay algo que no sepa sobre la depuración del código de socket? Realmente no sé mucho sobre programación de sockets, pero esa no es la parte que estoy tratando de ver.

Esto es con Visual C++ 2010.

EDITAR
Encontré el problema. Hubo una llamada profundamente anidada para system que en realidad estaba ejecutando el programa nuevamente con diferentes parámetros. Por lo tanto, no es un subproceso o un socket o lo que sea, en realidad es un proceso secundario completamente nuevo. ¿Hay alguna forma de que el depurador continúe con esto?

preguntado el 12 de junio de 12 a las 19:06

1 Respuestas

Opción 1

Cambie su llamada al "sistema" para pasar un parámetro "--waitfordebugger" al proceso secundario. Luego, en main o WinMain, verifique los argumentos de la línea de comando pasados ​​para este argumento. Si se detecta, haga que su código entre en un bucle infinito.

volatile int x = false;
while (x == false)
{
    Sleep(100);
}

Cuando se genere su proceso secundario, use Visual Studio para "adjuntar" al proceso secundario (menú de nivel superior, seleccione "Depurar" y "Adjuntar al proceso..."). Luego establezca un punto de interrupción en la instrucción Sleep. Cuando se alcanza el punto de interrupción (debe ser inmediato), cambie "x" en la ventana de observación a verdadero, establezca su nuevo punto de interrupción en el lugar del código que desea recorrer. Luego presione la tecla "continuar" (F5) para que el programa continúe.

Hay otras variaciones de esta técnica, incluido el uso de esperar hasta que la API IsDebuggerPresent() devuelva TRUE.

Opción 2

Cerca del lugar en el código que desea depurar, inserte una instrucción DebugBreak(). Esto generalmente creará un cuadro de diálogo de bloqueo para abrir. Si le solicita que adjunte un depurador, déjelo. De lo contrario, simplemente adjunte el depurador directamente como se describe en la Opción 1 y luego presione el botón correspondiente en el cuadro de diálogo de bloqueo para continuar. YMMV en este enfoque según el tipo de controladores de excepción que ya se hayan instalado y/o si la llamada a la función del sistema está configurada para ocultar fallas.

Respondido el 13 de junio de 12 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.