Valgrind fait une erreur de débogage

J’ai essayé de suivre le tutoriel en ligne pour Learn C The Hard Way .

Cependant, après avoir configuré valgrind (j’ai suivi d’autres liens qui aident à configurer valgrind sur Ubuntu 12.04), lorsque je tente de déboguer l’exécutable c, je trouve les erreurs suivantes.

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 dissortingbution to please in future ship a non- valgrind: ssortingpped 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$ 

Est-ce que je peux faire quelque chose pour que valgrind fonctionne enfin?

J’ai Ubuntu 12.04 sur la boîte virtuelle. Mon ordinateur portable est un système d’exploitation Windows 7 64 bits.

J’ai reçu essentiellement le même message (sauf que ld-linux-x86-64.so.2 été remplacé par ld-linux.so.2 ). J’avais installé Valgrind en utilisant apt-get alors libc6-dbg était déjà inclus en tant que dépendance.

Je ne l’ai pas encore complètement résolu, mais il est clair que l’erreur est corrélée à mon utilisation de -m32 lors de la construction.

Il semblerait donc que, dans mon cas, le problème est l’absence d’une version 32 bits de libc6-dbg (ou de certains de ses composants), lors de la construction d’une installation 64 bits d’Ubuntu 12.04.


Solution (pour mon cas)

Pour moi, la commande suivante a fait fonctionner les choses …

 sudo apt-get install libc6-dbg:i386 

Ceci est discuté à https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236

Remarque: Le paquet libc6-dbg:i386 ne s’affiche pas comme une option disponible dans Synaptic ou via la complétion de commande d’ apt-get – mais il y était quand même.

Ok, j’ai intsall libc6-dbg comme si

 sudo apt-get install libc6-dbg 

et valgrind semble bien fonctionner.

Grâce au lien du forum ubuntu:

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

J’ai longtemps lutté avec cela, la compilation en mode -m32 fonctionnait, mais c’était pénible. De plus, si je voulais utiliser par exemple -lcrypto, je ne pouvais pas comstackr en -m32 car je n’avais pas OpenSL installé en 32 bits. .

J’ai donc lu beaucoup de messages similaires, conseillant généralement d’installer libc6-dbg: i386 … Je pense que cela a résolu le problème de -m32, mais ce n’était pas ce que je cherchais. Donc, après un long moment, on en est venu à: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

Essayez donc de lancer dpkg -l libc6 * et si vous voyez libc6-amd64, cela pourrait vous aider. Mais lisez-le attentivement, surtout. Point 2, car vous ne pourrez plus utiliser aucune commande après avoir supprimé le paquet libc6-amd64, préparez donc un liveCD et suivez les instructions 🙂 . Je vous recommande de sauvegarder vos données avant de le faire, car si vous échouez, vous ne pourrez probablement pas revenir en arrière.

Et soyez prudent au point 4! Vous ne pouvez pas simplement écrire la commande suggérée ici
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 car cela créerait un lien symbolique dans le dossier live cd / . De plus, vous devez avoir les droits root pour écrire dans lib64. Alors, comment ça a été fait: (le dossier / de mon disque cassé valgrind a été ouvert via le 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

// vous vous référez au fichier sur le disque avec Linux cassé, mais si vous écriviez juste / au lieu de ./, vous créeriez le lien dans le dossier liveCD /

J’espère que je n’ai rien oublié et ce sera utile.

PS: Je me demande s’il est possible de changer le lien symbolique avant de supprimer le paquet libc6-amd64 (vous évitiez tout le contenu de liveCD) mais je ne suis pas sûr.