Valgrind hace un error de depuración

18

He estado tratando de seguir el tutorial en línea para Learn C The Hard Way .

Sin embargo, después de configurar valgrind (seguí otros enlaces que ayudan a configurar valgrind en ubuntu 12.04), cuando intento depurar el ejecutable c, encuentro los siguientes errores.

ayusman@ayusman-ubuntu:~/lcthw$ valgrind ./ex4
==1984== Memcheck, a memory error detector
==1984== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==1984== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==1984== Command: ./ex4
==1984== 

valgrind:  Fatal error at startup: a function redirection
valgrind:  which is mandatory for this platform-tool combination
valgrind:  cannot be set up.  Details of the redirection are:
valgrind:  
valgrind:  A must-be-redirected function
valgrind:  whose name matches the pattern:      strlen
valgrind:  in an object with soname matching:   ld-linux-x86-64.so.2
valgrind:  was not found whilst processing
valgrind:  symbols from the object with soname: ld-linux-x86-64.so.2
valgrind:  
valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
valgrind:  package on this machine.  (2, longer term): ask the packagers
valgrind:  for your Linux distribution to please in future ship a non-
valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
valgrind:  that exports the above-named function using the standard
valgrind:  calling conventions for this platform.  The package you need
valgrind:  to install for fix (1) is called
valgrind:  
valgrind:    On Debian, Ubuntu:                 libc6-dbg
valgrind:    On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo
valgrind:  
valgrind:  Cannot continue -- exiting now.  Sorry.

ayusman@ayusman-ubuntu:~/lcthw$ 

¿Hay algo que pueda hacer para que valgrind finalmente funcione?

Tengo ubuntu 12.04 en la caja virtual. Mi laptop es un sistema operativo Windows 7 de 64 bits.

Ayusman
fuente
Valgrind funcionó bien para mí desde el primer momento, pero no puedo decir qué bibliotecas ya había instalado. valgrind está disponible en repo. no necesitas compilar es como aprender C de la manera más difícil. la instalación desde el repositorio manejará el problema de dependencia por usted
RobotHumans

Respuestas:

42

Recibí esencialmente el mismo mensaje (excepto que ld-linux-x86-64.so.2fue reemplazado por ld-linux.so.2). Había instalado Valgrind usando apt-getlibc6-dbg ya estaba incluido como una dependencia.

Todavía no he resuelto completamente esto, pero una pista es que el error se correlaciona con mi uso de -m32cuando construyo.

Entonces parece que, en mi caso, el problema es la falta de una versión de 32 bits de libc6-dbg (o algunos de sus componentes), cuando se construye en una instalación de Ubuntu 12.04 de 64 bits.


Solución (para mi caso)

Para mí, el siguiente comando hizo que las cosas funcionaran ...

sudo apt-get install libc6-dbg:i386

Esto se discute en https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236

Nota: El paquete libc6-dbg:i386no se muestra como una opción disponible en Synaptic o mediante la finalización de comandos apt-get, pero estaba allí de todos modos.

sin bar
fuente
Hay un buen cambio que necesitará ayuda para construir primero: stackoverflow.com/a/7412698/86967
nobar
esto debe marcarse como correcto; Esta :i386es la clave aquí.
Thomas Shields
¡Fue el 32 bits que hizo el truco!
Cardin
1
Esto lo resolvió para mí. Estaba viendo este error en una máquina vagabunda. Como dijeron los otros comentaristas, esto debería marcarse como correcto. (libgc-dbg ya estaba instalado como una dependencia valgrind, fue el i386 el que hizo el truco)
Ken
Esta respuesta trató correctamente con binarios de 32 bits. libc6-dbgya estaba insinuado en valgrindel mensaje de error de.
leesei
11

Ok, hice intsall libc6-dbg así

sudo apt-get install libc6-dbg

y valgrind parece funcionar bien.

Gracias al enlace del foro de ubuntu:

http://ubuntuforums.org/showthread.php?t=1017692

Ayusman
fuente
@ Goaler444 que acabo de hacer. Gracias por recordar.
Ayusman
Como los otros puntos de respuesta, hacer sudo apt-get install libc6-dbg:i386podría ser una solución dependiendo del binario que se va a valorar (64 bits frente a 32 bits).
cierre de sesión el
0

Luché con esto durante mucho tiempo, compilar en modo -m32 funcionó, pero fue un fastidio, además, si quisiera usar, por ejemplo, -lcrypto, no podría compilar en -m32 ya que no tenía openssl en 32 bits instalado .

Así que leí muchas publicaciones similares, generalmente aconsejando instalar libc6-dbg: i386 ... Creo que esto resolvió el problema para -m32, pero no era lo que estaba buscando. Entonces, después de mucho tiempo, llegó a esto: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

Intente ejecutar dpkg -l libc6 * y si ve libc6-amd64, esto podría ayudarlo. Pero léalo cuidadosamente esp. punto 2, porque no podrá utilizar ningún comando después de eliminar el paquete libc6-amd64, así que prepare un liveCD y siga las instrucciones :) Me ayudó a resolver el problema, pero me llevó unas 3 horas y un par de momentos de miedo . Recomiendo hacer una copia de seguridad de sus datos antes de hacerlo, porque si falla, probablemente no habrá vuelta atrás.

¡Y ten cuidado en el punto 4! Simplemente no puede escribir el comando sugerido allí
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 porque haría un enlace simbólico en la /carpeta de CD en vivo . También debe tener derechos de root para escribir en lib64. Entonces, cómo lo hice fue: (tenía / carpeta en mi disco valgrind roto abierto a través del terminal liveCD)

1)sudo rm ./lib64/ld-linux-x86-64.so.2 //removing old link

2)sudo ln -s /lib/x86_64-linux-gnu/ld-2.17.so ./lib64/ld-linux-x86-64.so.2

//you refer to the file on the disk with broken linux, but if you wrote just / instead of ./ you would create the link in the liveCD / folder

Espero no haber olvidado nada y esto será útil.

PD: Me pregunto si es posible cambiar el enlace simbólico antes de eliminar el paquete libc6-amd64 (omitiría todo el contenido del liveCD), pero no estoy seguro.

krumpac007
fuente
Por favor cuida tu idioma !!!
Panther