2012-05-20 7 views
7

que he escrito:¿Cómo hacer que gdb siga a execv? No funciona a pesar de dos programas sencillos "-modo exec seguimiento"

int main(int ac, char **argv) { 
    execv("/home/me/Desktop/execvtest2", argv); 
} 

y

int main(int ac, char **argv) { 
    execv("/home/me/Desktop/execvtest1", argv); 
} 

Los he compilado con gcc -g a los OutputFiles acuerdo. Estoy ejecutando Ubuntu 10.10 usando gcc (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5.

Cuando estoy depurando el primer programa con GNU gdb (GDB) 7.2-ubuntu, puedo dar un paso hasta la primera instrucción execv, pero luego los dos archivos simplemente continúan ejecutándose. Incluso si configuro el modo follow-exec como nuevo, no puedo ingresar al segundo programa. Cuando configuro catch exec, gdb se detiene en cada llamada a execv (de alguna forma, sin fuente vinculada para el segundo programa, y ​​no puedo salir de gdb, ya que se cuelga !?), pero no puedo para pasar la llamada al programa inferior "nuevo" (como el ejecutivo reemplaza al proceso).

Entonces, ¿cómo se puede hacer esto? Debe haber una manera de entrar en el nuevo proceso ¿verdad? ¿Estoy haciendo algo mal?

Cheers

+0

¿Qué sistema operativo, qué versión de 'gcc' estás usando? – alk

+0

Acabo de probar esto usando 'gcc' version' (Debian 4.4.5-8) 4.4.5', establezco un punto de ruptura para la línea 2 y veo' gdb' muy bien interrumpido en los dos ejecutables. – alk

+0

Por cierto: El 'gcc' utilizado para esta prueba (con la versión mencionada anteriormente) de alguna manera ahora no trata sobre' follow-exec-mode'. – alk

Respuesta

5

puede utilizar el comando "catch". esto le dará la oportunidad de poner algunos puntos de quiebre después de la ejecución

+0

Me sorprende que este usuario no haya obtenido más votos. ¡Funciona de maravilla! – andreee

2

He estado haciendo algo muy similar a lo que está haciendo para una de mis clases. Es un poco hackish y si estás tratando de obtener cosas como valores de registro puede estropear las cosas. De acuerdo con GDB's documentation, puede cambiar el archivo de símbolos mientras mantiene el archivo de ejecución. Para hacer esto, simplemente use el comando symbol-file file2. Tenga en cuenta que este debe ser un archivo binario compilado con el indicador GDB (-g en GCC). Después de haber cargado este archivo de símbolos, no podrá romper o ver ninguna de las líneas del archivo de ejecución original. Sin embargo, puede establecer puntos de interrupción para el nuevo archivo de símbolos, es decir, break file2.c:40 y luego ejecutar paso a paso como en el caso anterior. Es un poco hackish y puede que no funcione perfectamente porque esencialmente está capturando la ejecución de un nuevo proceso y asignándolo a la tabla de símbolos de su archivo binario, sin usar ese archivo binario para ejecutarlo directamente. No he tenido resultados estelares, pero puede ver los valores intermedios de esta manera. Otra cosa, para volver a depurar el archivo original tendrá que hacer symbol-file file para volver a cargar su tabla de símbolos.

Cuestiones relacionadas