2012-02-17 17 views
52

Estoy siguiendo 'Learn C the Hard Way', específicamente the chapter on Valgrind. Este capítulo le proporciona un programa deliberadamente incorrecto para mostrar cómo funciona Valgrind.Valgrind no muestra los números de línea a pesar del indicador -g (en Ubuntu 11.10/VirtualBox)

Cuando ejecuto el ejercicio en Valgrind no obtengo los números de línea en mi rastro de pila, solo '(debajo del principal)' para los errores.

Estoy definitivamente compilando con la bandera -g.

Mi salida Valgrind es el siguiente:

[email protected]:~/projects/Learning/C$ valgrind ./ex4 
==5190== Memcheck, a memory error detector 
==5190== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==5190== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info 
==5190== Command: ./ex4 
==5190== 
==5190== Use of uninitialised value of size 4 
==5190== at 0x4078B2B: _itoa_word (_itoa.c:195) 
==5190== by 0x407CE55: vfprintf (vfprintf.c:1619) 
==5190== by 0x40831DE: printf (printf.c:35) 
==5190== by 0x4052112: (below main) (libc-start.c:226) 
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s) 
==5190== at 0x4078B33: _itoa_word (_itoa.c:195) 
==5190== by 0x407CE55: vfprintf (vfprintf.c:1619) 
==5190== by 0x40831DE: printf (printf.c:35) 
==5190== by 0x4052112: (below main) (libc-start.c:226) 
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s) 
==5190== at 0x407CC10: vfprintf (vfprintf.c:1619) 
==5190== by 0x40831DE: printf (printf.c:35) 
==5190== by 0x4052112: (below main) (libc-start.c:226) 
==5190== 
==5190== Conditional jump or move depends on uninitialised value(s) 
==5190== at 0x407C742: vfprintf (vfprintf.c:1619) 
==5190== by 0x40831DE: printf (printf.c:35) 
==5190== by 0x4052112: (below main) (libc-start.c:226) 
==5190== 
I am 0 years old. 
I am 68882420 inches tall. 
==5190== 
==5190== HEAP SUMMARY: 
==5190==  in use at exit: 0 bytes in 0 blocks 
==5190== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==5190== 
==5190== All heap blocks were freed -- no leaks are possible 
==5190== 
==5190== For counts of detected and suppressed errors, rerun with: -v 
==5190== Use --track-origins=yes to see where uninitialised values come from 
==5190== ERROR SUMMARY: 22 errors from 4 contexts (suppressed: 11 from 6) 

estoy usando Ubuntu 11.10 en un VirtualBox VM.

Gracias por cualquier ayuda.

actualización

Parece que si llamo a una función de main() y que función contiene un error (por ejemplo, una variable no inicializada), entonces yo hago obtener una huella en el lugar que la función se llama en main(). Sin embargo, los errores dentro de main() permanecen sin especificar. Ver this paste para un ejemplo.

+0

Por favor, crear un directorio nuevo, vacío, y el lugar en ese directorio lo que se encuentra en http://pastebin.com/A6bK2hdw; es un script bash que intenta recrear el problema. Cuando lo ejecuto, obtengo un resultado como el que puede ver en http://pastebin.com/JncWz2GF, que es lo que su tutorial dice que debe obtener. Ejecútalo tú mismo. Si obtienes la salida adecuada, entonces determina cómo la forma en que lo hiciste difiere de este script de shell. Si ejecuta este script de shell y obtiene el resultado incorrecto como nos muestra arriba, regrese y hablemos de ello. –

+0

Hola @Bill, gracias por tu ayuda. Al ejecutar su script, obtengo el mismo resultado más una advertencia sobre el sesgo del reloj. [http://pastebin.com/fjfPrLts](http://pastebin.com/fjfPrLts) – djb

+0

¿Quiere decir "el mismo resultado" que obtuvo antes, o "el mismo resultado" que obtuve? –

Respuesta

50

La salida que ya ha proporcionado en su pregunta contiene la siguiente línea:

==5190== Use --track-origins=yes to see where uninitialised values come from 

por este mensaje se debe ejecutar ./ex4 así:

valgrind --track-origins=yes ./ex4 

Para evitar algunos problemas con Valgrind incapaces de encontrar depuración información, puede usar enlace estático:

gcc -static -g -o ex4 ex4.c 

salida de Valgrind contendrá entonces mensajes como Uninitialised value was created by a stack allocation:

==17673== Memcheck, a memory error detector 
==17673== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==17673== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==17673== Command: ./ex4 
... 
==17673== Use of uninitialised value of size 4 
==17673== at 0x805CA7B: _itoa_word (in /home/user/ex4) 
==17673== by 0x8049D5F: printf (in /home/user/ex4) 
==17673== by 0x8048ECD: main (ex4.c:8) 
==17673== Uninitialised value was created by a stack allocation 
==17673== at 0x8048EFA: bad_function (ex4.c:17) 
... 
==17673== Use of uninitialised value of size 4 
==17673== at 0x805CA7B: _itoa_word (in /home/user/ex4) 
==17673== by 0x8049D5F: printf (in /home/user/ex4) 
==17673== by 0x80490BE: (below main) (in /home/user/ex4) 
==17673== Uninitialised value was created by a stack allocation 
==17673== at 0x8048EBE: main (ex4.c:4) 
... 
I am -1094375076 years old. 
... 
I am -1094369310 inches tall. 
... 
==17673== 
==17673== HEAP SUMMARY: 
==17673==  in use at exit: 0 bytes in 0 blocks 
==17673== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==17673== 
==17673== All heap blocks were freed -- no leaks are possible 
==17673== 
==17673== For counts of detected and suppressed errors, rerun with: -v 
==17673== ERROR SUMMARY: 83 errors from 21 contexts (suppressed: 0 from 0) 

Archivo ex4.c: salida

1 #include <stdio.h> 
2 
3 int main() 
4 { 
5   int age = 10; 
6   int height; 
7 
8   bad_function(); 
9 
10   printf("I am %d years old.\n"); 
11   printf("I am %d inches tall.\n", height); 
12 
13   return 0; 
14 } 
15 
16 int bad_function() 
17 { 
18   int x; 
19   printf("%d\n", x); 
20 } 

de Valgrind no es lo ideal. Identifica el marco de pila (función) que contiene la variable no inicializada, pero no imprime el nombre de la variable.

Ejecutar Linux en VirtualBox no tiene ningún efecto en Valgrind.

+0

¡Gracias! No puedo creer que me haya perdido eso. Creo que necesito una lección de lectura ... – djb

+10

Incluso si ha tenido lecciones de lectura, aún no habría resuelto su problema. Esta respuesta no resuelve nada. La salida de Valgrind en el tutorial da la línea en la cual se está utilizando la variable no inicializada. Eso es muy diferente de la salida dada a través de --track-origins = yes ... y dado que el problema original era cómo obtener el mismo resultado que los tutoriales en Ubuntu, la pregunta debería estar abierta ... por cierto, el mismo problema se está ejecutando en Ubuntu 11.10 (no a través de una VM) usando valgrind 3.7.0. – justin

2

En muchas distros, la versión predeterminada de glibc no contiene símbolos de depuración.

Intente instalar el paquete libc6-dbg.

+2

gracias, pero ya está instalado ... – djb

1

intento gcc no cc

cc no proporciona los números de línea, pero gcc hace

16

yo también estaba compilando con la bandera -g y todavía no obtener los números de línea.Después de eliminar el directorio .dSYM para mi aplicación y ejecutar valgrind con la opción --dsymutil=yes, finalmente obtuve los números de línea.

+1

Esto funcionó para mí con el mismo problema –

+1

Eso es solo para OS X. –

+0

'valgrind --track-orígenes = sí --dsymutil = sí./FILE_NAME' hace el truco en Ubuntu, y compilé con la bandera' -g' –

2

debe compilarlo con "-g". gcc -g test.c -o prueba y luego valgrind --track-orígenes = yes --leak-check = full ./test

+1

"Estoy * definitivamente * compilando con la bandera -g". - cita de OP. – DevSolar

1

cuenta que la ejecución valgrind con el --dsymutil = yes it solución solo para Mac OS X.

de acuerdo con los documentos:

- dsymutil = no | sí [no] Esta opción sólo es relevante cuando se ejecuta Valgrind en Mac OS X.

Mac OS X utiliza un esquema de vinculación de información de depuración diferida (debuginfo). Cuando los archivos de objetos que contienen información de depuración están vinculados en un ejecutable .dylib o , la información de depuración no se copia en el archivo final. En su lugar, el debuginfo debe vincularse manualmente ejecutando dsymutil, una utilidad proporcionada por el sistema , en el archivo ejecutable o .dylib. El resultante combinado debuginfo se coloca en un directorio junto con el ejecutable o .dylib, pero con la extensión .dSYM.

0

He perseguido este problema y ninguna de las otras respuestas funcionó. Mi salida mostraba los símbolos correctos, pero los números de línea no estaban presentes.

En mi caso, era debido a que la biblioteca en cuestión utilizaba la información del número de línea comprimida .zdebug, y la versión de valgrind que estaba usando era antigua y todavía no tenía el parche necesario [0].

La solución fue actualizar valgrind a la última versión.

[0] https://bugs.kde.org/show_bug.cgi?id=303877

Cuestiones relacionadas