Valgrind powoduje błąd debugowania

18

Staram się postępować zgodnie z samouczkiem online dla Learn C The Hard Way .

Jednak po skonfigurowaniu valgrind (skorzystałem z innych linków, które pomagają skonfigurować valgrind na Ubuntu 12.04), kiedy próbuję debugować plik wykonywalny c, znajduję następujące błędy.

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$ 

Czy jest coś, co mogę zrobić, aby Valgrind w końcu zadziałał?

Mam Ubuntu 12.04 na wirtualnym pudełku. Mój laptop to 64-bitowy system operacyjny Windows 7.

Ayusman
źródło
valgrind działał dla mnie dobrze po wyjęciu z pudełka, ale nie mogę powiedzieć, jakie biblioteki już zainstalowałem. valgrind jest dostępny w repozytorium. nie musisz się kompilować, to jak nauka C w trudny sposób. instalacja z repozytorium poradzi sobie z problemem zależności
RobotHumans

Odpowiedzi:

42

Dostałem w zasadzie ten sam komunikat (z wyjątkiem tego, że ld-linux-x86-64.so.2został zastąpiony przez ld-linux.so.2). Zainstalowałem Valgrind za pomocą apt-getlibc6-dbg, który był już uwzględniony jako zależność.

Nie w pełni to rozwiązałem, ale wskazówka jest taka, że ​​błąd koreluje z moim wykorzystaniem -m32podczas budowania.

Wydaje się więc, że w moim przypadku problemem jest brak 32-bitowej wersji libc6-dbg (lub niektórych jej składników), podczas budowania na 64-bitowej instalacji Ubuntu 12.04.


Rozwiązanie (w moim przypadku)

Dla mnie następujące polecenie sprawiło, że wszystko działało ...

sudo apt-get install libc6-dbg:i386

Omówiono to na stronie https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236

Uwaga: Pakiet libc6-dbg:i386nie pojawia się jako dostępna opcja w Synaptic lub po wykonaniu polecenia apt-get- ale i tak tam był.

nobar
źródło
Jest dobra zmiana, której potrzebujesz najpierw do zbudowania: stackoverflow.com/a/7412698/86967
nobar
należy to zaznaczyć jako poprawne; tutaj :i386jest klucz.
Thomas Shields,
To był 32-bit, który załatwił sprawę!
Cardin,
1
To dla mnie rozwiązało. Widziałem ten błąd na błędnej maszynie. Jak powiedzieli inni komentatorzy, należy to zaznaczyć jako poprawne. (libgc-dbg został już zainstalowany jako zależność valgrind, to i386 załatwiło sprawę)
Ken
Ta odpowiedź poprawnie dotyczyła 32-bitowych plików binarnych. libc6-dbgzostał już wskazany w valgrindkomunikacie o błędzie.
leesei
11

Ok, zrobiłem tak wewnątrz libc6-dbg

sudo apt-get install libc6-dbg

i valgrind wydaje się działać dobrze.

Dzięki linku do forum ubuntu:

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

Ayusman
źródło
@ Goaler444 Właśnie to zrobiłem. Dzięki za przypomnienie.
Ayusman
podobnie jak w innych punktach odpowiedzi, robienie sudo apt-get install libc6-dbg:i386może być rozwiązaniem zależnym od walidowanego pliku binarnego (64 bity vs 32 bity).
wyloguj się
0

Zmagałem się z tym przez bardzo długi czas, kompilacja w trybie -m32 działała, ale to był problem w dupie, ponadto jeśli chciałem użyć np. -Lcrypto, nie mogłem skompilować w -m32, ponieważ nie miałem zainstalowanego openssl w 32-bitowym systemie .

Przeczytałem więc wiele podobnych postów, zwykle zalecając instalację libc6-dbg: i386 ... Myślę, że to rozwiązało problem dla -m32, ale nie tego szukałem. Po długim czasie doszło do tego: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

Spróbuj uruchomić dpkg -l libc6 *, a jeśli zobaczysz libc6-amd64, może ci to pomóc. Ale przeczytaj to dokładnie esp. punkt 2, ponieważ po usunięciu pakietu libc6-amd64 nie będziesz mógł używać żadnych poleceń, więc przygotuj LiveCD i postępuj zgodnie z instrukcjami :) Pomogło mi to rozwiązać problem, ale zajęło mi to około 3 godzin i kilka chwil strachu . Zalecam wykonanie kopii zapasowej danych, zanim to zrobisz, ponieważ jeśli zawiedziesz, prawdopodobnie nie będzie możliwości powrotu.

I bądź ostrożny w punkcie 4! Nie można po prostu napisać sugerowanego tam polecenia,
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 ponieważ utworzy ono symboliczne łącze w /folderze Live CD . Musisz także mieć prawa roota, aby pisać na lib64. Więc jak to zrobiłem: (miałem / folder na moim uszkodzonym dysku valgrind otwartym przez 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

Mam nadzieję, że nic nie zapomniałem, a to będzie pomocne.

PS: Zastanawiam się, czy można zmienić dowiązanie symboliczne przed usunięciem pakietu libc6-amd64 (pominiesz cały materiał LiveCD), ale nie jestem pewien.

krumpac007
źródło
Uważaj na swój język !!!
Panther,