2012-01-23 11 views
5

? Se me ha preguntado en una entrevista cómo se puede eliminar la falla de segmentación en el programa C usando GDB.¿Cómo puedo encontrar una falla de segmentación de múltiples archivos usando GDB

Les dije que podemos compilar nuestro programa con la opción -g para que agregue información de depuración a un archivo binario y pueda leer el archivo de volcado del núcleo pero el entrevistador me dijo si tenía 3 o 4 archivos compilados pero uno de ellos causaba falla de segmentación, ¿cómo depuramos en GDB?

+0

A menos que esté realmente malentendido lo que estás pidiendo, todavía habría compila todos ellos con -g y depuración en la misma exacta camino. –

+0

También les di la misma solución pero no impresionaron en absoluto, lo que argumentan no nos dirá el nombre exacto del archivo que causa la falla de segmentación –

+1

En realidad, de todas las preguntas de la entrevista que he visto por aquí, este es realmente bastante sensato Tiene sentido comprobar si un desarrollador sabe cómo usar el depurador disponible en la plataforma correspondiente. –

Respuesta

0

Parece que están intentando configurarlo para que pueda seguir el código mientras se está ejecutando, puede hacerlo con la versión de línea de comandos o creo que puede obtener una GUI para GDB.

1

Si está trabajando en Linux, la forma más fácil de encontrar la falla de segmentación es utilizando la herramienta llamada VALGRIND: http://valgrind.org/.

Solo necesita compilar su código con la bandera -g y luego ejecutar ./valgrind.

A continuación, sabrá exactamente en qué función y en qué línea de código hay una lectura de memoria/memoria no inicializada por error del espacio asignado o sth.

3
$ gcc -ggdb s1.c s2.c s3.c -o myprog 
$ gdb myprog 
(gdb) run --arg1 --arg2 

GDB ejecutará el programa de forma normal, cuando el fallo de segmentación se produce BGF caer de nuevo a su pronta y será casi lo mismo que ejecutar BGF con un archivo central. La principal diferencia es que hay algunas cosas que no puedes hacer/imprimir con un archivo central que puedes cuando el programa se ha colgado dentro de GDB. (Puede usar print para llamar a algunas funciones dentro del programa, por ejemplo.)

También puede adjuntar a un programa que ya se está ejecutando utilizando gdb --pid <the programs pid>.

Ya sea con un archivo central o con uno de los métodos anteriores, cuando se tiene el símbolo del BGF después del accidente, tipo backtrace (o bt para abreviar) y el BGF le mostrará la pila en el momento del accidente, incluyendo los nombres de los archivos y los números de línea de cada llamada y la línea que se está ejecutando actualmente.

+0

Pensé que deberíamos usar "gcc -g", qué significa "gcc -ggdb" –

+0

[El manual] (https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Debugging-Options .html # Debugging-Options) explica ... -ggdb puede producir información adicional para GDB que -g no. Si vas a usar GDB, deberías usar -ggdb. – SoapBox

+0

gracias SoapBox :) –

1

Acaba de ejecutar el programa en gdb, y el depurador captura el SIGSEGV y le muestra la línea y las instrucciones que fallaron. Luego, simplemente examine la variable y/o registre los valores para ver qué está mal. Por lo general, es un valor de puntero deshonesto, y tratar de acceder a él con GDB dará y error, por lo que es fácil.

Y sí, recompilar todo con -g sería útil. El entrevistador probablemente quería que describieras cómo averiguarías qué archivo tenía la culpa (gdb solo te dice cuándo capta la señal) y simplemente recompila ese con la información de depuración. Si hay 20,000 archivos fuente que pueden ser útiles, pero con 3 o 4 archivos, ¿cuál es el punto? Incluso con proyectos más grandes, generalmente terminas persiguiendo el puntero malo a través de 10 funciones y 5 archivos de todos modos, así que de nuevo, ¿cuál es el punto? La información de depuración no cuesta nada en tiempo de ejecución, aunque cuesta espacio en disco en una instalación.

+0

¿Por qué el voto a favor? – ams

1

compilar el código en forma normal, dando el nombre de archivo gcc obtendrá un archivo .out, empiezan a correr eso y obtener el ID del proceso por medio de ps -aef | grep filename.out

en otra ventana tipo gdb e introducir, dentro de gdb dar pronta attach processid (procesado obtendrá del comando anterior), dé c para continuar. Una vez que la ejecución finalice, proporcione "bt" dentro de gdb. Obtendrá el lugar donde se produce la segmentación.

0

se pueden utilizar los siguientes pasos para el fallo de segmentación de depuración usando GDB

$ gdb <exec name > 
$ r   //run the pgm 
$ where 
$ f <1> <0> //to view the function n variables 

$ list 

$ p <variable>  
Cuestiones relacionadas