es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprensión de la superposición de la imagen del proceso y la llamada de ejecución de un archivo.

Quiero construir mi propio depurador, desde cero, así que estoy tratando de entender algunos de los conceptos detrás de él. En primer lugar, estoy comenzando fácil, usando la biblioteca ptrace. Pero incluso en este punto tengo algunos problemas, déjame repasar este código:

int main(int argc, char** argv)
{
    pid_t child_pid;

    if (argc < 2) {
        fprintf(stderr, "Se esperaba el nombre del programa como argumento\n");
        return -1;
    }

    child_pid = fork();
    if (child_pid == 0)
        run_target(argv[1]);
    else if (child_pid > 0)
        run_debugger(child_pid);
    else {
        perror("fork");
        return -1;
    }

    return 0;
}

No hay nada realmente especial en esto, estoy creando un proceso hijo usando fork(). La siguiente función es la que realmente no puedo entender.

void run_target(const char* programname)
{
    procmsg("El objetivo ha comenzado. Ejecutará '%s'\n", programname);

    /* Permitir el rastreo de este proceso */
    if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
        perror("ptrace");
        return;
    }

    /* Reemplazar la imagen de este proceso con el programa dado */
    execl(programname, programname, 0);
}

La última llamada es el problema. Esta llamada representa el concepto de superposición de imagen del proceso. No entiendo completamente lo que está sucediendo. Esto es lo que dice el autor:

He resaltado la parte que nos interesa en este ejemplo. Tenga en cuenta que lo siguiente que hace `run_target` después de `ptrace` es invocar el programa dado como argumento con `execl`. Esto, como explica la parte resaltada, hace que el kernel del sistema operativo detenga el proceso justo antes de comenzar a ejecutar el programa en `execl` y envíe una señal al padre.

Para ejecutar el depurador, básicamente el proceso padre debe rastrear el proceso hijo, que reconoce que desea ser rastreado utilizando PTRACEME. Pero no puedo entender qué hace execl. Entiendo el propósito y el resultado, pero no puedo entender CÓMO. Consulté las páginas del manual pero no pude entenderlo completamente.

Agradecería si alguien pudiera darme una explicación clara de qué está sucediendo con esta función execl.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La función execl se utiliza para reemplazar la imagen actual del proceso con un nuevo proceso especificado en los argumentos de la función. En este código, la función se utiliza para ejecutar el programa especificado como argumento en la función run_target.

    Después de crear el proceso hijo utilizando fork(), se llama a la función run_target en el proceso hijo. Lo primero que hace la función es llamar a ptrace() con el argumento PTRACE_TRACEME, lo cual permite al proceso padre rastrear al proceso hijo.

    La siguiente línea de código, execl(programname, programname, 0), reemplaza la imagen actual del proceso con el programa especificado en programname. Esto significa que el proceso hijo se convierte en el programa especificado en programname y comienza a ejecutarlo.

    Sin embargo, dado que el proceso padre está rastreando al proceso hijo, el kernel envía una señal SIGTRAP al proceso padre justo antes de que el proceso hijo comience a ejecutar el programa especificado en programname. Esta señal permite al proceso padre pausar la ejecución del proceso hijo, establecer puntos de interrupción, leer y escribir en la memoria, y realizar otras operaciones de depuración.

    En resumen, la función execl se utiliza para reemplazar la imagen actual del proceso con una nueva imagen de programa. En este código, permite al proceso padre rastrear al proceso hijo y pausar su ejecución justo antes de que comience a ejecutar el programa especificado en programname.

Comments are closed.