Step-over cambia el subproceso mientras se depura el programa C de subprocesos múltiples con vscode

2 minutos de lectura

Paso a paso del programa C de subprocesos múltiples con el depurador de VSCode cambia el subproceso en cada paso.

El hilo donde salta el depurador ejecuta un código como este:

do {
    rc = nanosleep(&rqtp, &rem);
    rqtp = rem;
} while (rc < 0 && errno == EINTR);

La configuración de mi depurador es la siguiente: “versión”: “0.2.0”, “configuraciones”:[[

    {
        "name": "solid Launch",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceRoot}/program",
        "args": ["-a","-b"],
        "stopAtEntry": true,
        "cwd": "${workspaceRoot}",
        "environment": [],
        "externalConsole": true,
        "linux": {
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    }

P1: ¿Cómo hago para que el depurador se quede con el hilo que se encontró con el punto de interrupción?

P2: ¿Cómo mantengo el foco en la pila de llamadas que pertenece a ese hilo?

Respuesta a P1: De acuerdo con este hilo SO, agregando set scheduler-locking on to the gdb le permitirá permanecer en el mismo hilo cuando haga un solo paso.

No estoy seguro sobre Q2, pero esto debería darle lo que necesita para continuar. Creo que se muestra la pila de llamadas del hilo actual, pero no estoy seguro.

  • Gracias. Esto me estaba volviendo loco. ¿Cómo puedo configurar gdb o vscode para que esto se habilite automáticamente en cada sesión de gdb?

    – jknight

    25 oct 2022 a las 23:09

  • @jknight lo puso ~/.gdbinityo diría, de esa manera debería cargarse en cada sesión

    – leónkor

    26 oct 2022 a las 12:31


  • Puse er allí pero hace que esta salida ‘Objetivo ‘Ninguno’ no puede admitir este comando’. Creo que ya tienes que estar conectado al programa. Además, me gustaría entender más acerca de por qué mi programa vomita totalmente en el ‘paso siguiente’ sin el bloqueo del programador habilitado. No hay indicios de lo que sucedió, solo el ‘cursor’ parece ir a la tierra de las tonterías. Esto es incluso con todas las señales configuradas en ‘nostop’, solo 1 punto de interrupción establecido, que solo 1 hilo golpea, y compilación de depuración. El cursor incluso retrocede. Estoy usando VSCode, así que tal vez haya un error en gdbmi. Los efectos del siguiente paso son realmente extraños.

    – jknight

    27 oct 2022 a las 15:14


Solo encontré una opción para hacer esto. En la consola de depuración de VS Code, cuando se detiene en un punto de interrupción, debe ejecutar el comando

-exec set scheduler-locking step

ingrese la descripción de la imagen aquí

Desafortunadamente, no puedo encontrar cómo configurar el scheduler-locking opción antes de iniciar la depuración. Entonces, pregunté sobre esto aquí.

¿Ha sido útil esta solución?