2010-11-01 10 views
10

Estoy trabajando en C/C++ en UNIX y con frecuencia he visto archivos principales. Muchas veces es difícil depurar los archivos del núcleo para encontrar la causa real del núcleo o la falla de segmentación. ¿Podría sugerirme un depurador eficiente?Mejor herramienta de depuración para C y C++

+3

¿Qué compilador estás usando? El depurador necesita leer los símbolos de depuración generados por su compilador. En general, gdb funciona mejor con gcc, dbx con Sun CC, etc. – Rup

+0

Estoy usando cc en UNIX –

+1

Sachin: Eso en realidad no nos dice mucho. ¿Qué 'cc'? ¿Qué UNIX? – Ken

Respuesta

8

creo que la mayoría de los compiladores de C en la mayoría de los sabores de apoyo * nix -g para incluir símbolos de depuración dentro de los archivos de objetos, por lo que si lo hace:

cc -g -c file1.c 
cc -g -c file2.c 
cc -g file1.o file2.o -o program 
./program 

A continuación, cuando se ejecuta el programa si se bloquea debería producir una archivo central depurado más fácilmente. Las primeras dos líneas simplemente compilan archivos fuente (produciendo archivos .o), la tercera línea le dice al compilador que llame al enlazador para vincular los archivos fuente en un archivo ejecutable (pasar -g aquí puede que no haga nada si el enlazador no tiene que hacer algo especial para producir un ejecutable con símbolos de depuración, pero no debería doler nada), y la última línea ejecuta el programa. Debe asegurarse de no decirle al compilador que realice optimizaciones cuando intente depurar (a menos que descubra que no tiene errores a menos que se activen las optimizaciones), ya que las optimizaciones suelen dificultar el seguimiento.

Ya que no sé en qué plataforma está o qué herramientas tiene disponible (o realmente incluso qué compilador de C está utilizando), entonces es difícil dar consejos más específicos. Debe leer la página de manual (manual) para su compilador. Desde la línea de comandos:

man cc 

Y eso debería mostrar una página del manual que te dice un montón de cosas sobre el compilador en su sistema. Esto puede indicarle cómo decirle al compilador que produzca más mensajes de advertencia, lo que podría ayudarlo a encontrar sus errores incluso antes de ejecutar sus programas. (tenga en cuenta que algunas advertencias solo pueden producirse si compila con ciertas optimizaciones activadas, por lo que, aunque probablemente no desee depurar el programa optimizado, puede compilarlo con optimizaciones y advertencias adicionales activadas solo para ver si decirte algo).

Su sistema Unix probablemente tenga instalado algún tipo de depurador. La mayoría de las máquinas Linux configuradas para el desarrollo de C tienen instalado gdb. gdb se puede utilizar para ejecutar su programa en modo de depuración o para analizar un archivo central.Si tiene gdb puede:

gdb ./program 

se iniciará listo para ejecutar su programa. Si lo hace:

gdb ./program ./core 

se comportará de manera similar, excepto que será como si estuviera depurando y su programa acaba de estrellarse. A partir de este estado lo más rápida y más útil que puede hacer es

(gdb) bt 

Aquí (gdb) es la pronta y bt es un comando que dice para producir una copia de rastro. Eso significa una pila de llamadas, que muestra en qué función estaba el programa cuando ocurrió la falla, y qué función llamó esa función, y qué función llamó esa función, y así sucesivamente hasta la primera función. Esto puede ser confuso porque a menudo mostrará las funciones de la biblioteca como la llamada más reciente, pero esto generalmente significa que ha pasado datos no válidos en alguna parte del camino que está causando el problema.

gdb es un programa grande y complejo, así que si está en su sistema, debería tomarse el tiempo para leerlo.

Si no está en su sistema, entonces debe averiguar qué herramientas son similares. Algunos de los depuradores gráficos (ya sea dentro de un IDE o no) actúan como interfaces para los depuradores de línea de comandos y algunos incluso admiten varios depuradores de línea de comandos diferentes, por lo que si puede usar uno de los depuradores gráficos, puede que no tenga que preocuparse sobre qué depurador real de la línea de comando back-end se está utilizando.

2

Generalmente, gdb es un excelente depurador (aunque toma un poco aprender). También hay varias interfaces, algunas con una GUI, como DDD o cgdb.

Si explica dónde específicamente tiene problemas, es posible que podamos recomendar mejor qué depurador lo ayudará más.

7

Use gdb. Es el depurador Unix C/C++ estándar de facto y, a partir de la versión 7.0, tiene características de depuración reversibles (puede retroceder en el tiempo). Estas razones por sí mismas hacen que al menos valga la pena verificarlo.

10

Para las fallas de segmentación, pérdida de memoria, datos no inicializados y demás, ejecutar su programa a través de valgrind siempre es una buena idea. Si está especialmente interesado en fugas de memoria, la opción "--leak-check = full" vale la pena.

Y sí, aprende gdb. Toma un poco de tiempo, pero vale la pena.

+0

Tenga en cuenta que esto es algo que haría si tiene una forma consistente de reproducir un núcleo y desea identificar la causa. valgrind no procesa los archivos centrales que ya están generados. – aschepler

3

Me gusta mucho Totalview. Las características de depuración paralelas son las que me gustan tanto como a mí.

Cuestiones relacionadas