Valgrind hata ayıklama hatası yapıyor


18

Learn C The Hard Way için çevrimiçi öğreticiyi takip etmeye çalışıyorum .

Ancak valgrind kurduktan sonra (ubuntu 12.04 üzerinde valgrind kurulumuna yardımcı olan diğer bağlantıları izledim), c yürütülebilir hata ayıklamaya çalıştığınızda, aşağıdaki hataları buluyorum.

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$ 

Sonunda valgrind'in çalışması için yapabileceğim bir şey var mı?

Sanal kutuda ubuntu 12.04 var. Dizüstü bilgisayarım Windows 7 64 bit işletim sistemidir.


valgrind benim için kutunun dışında iyi çalıştı, ama zaten hangi kütüphaneleri kurduğumu söyleyemem. valgrind repo'dan edinilebilir. derlemenize gerek yok C zor yoldan öğrenmek gibi.
— repo'dan yükleme

Yanıtlar:


42

Aslında aynı mesajı aldım (bunun ld-linux-x86-64.so.2yerine ld-linux.so.2). Valgrind'i kullanarak apt-getlibc6-dbg'yi zaten bağımlılık olarak dahil etmiştim.

Bunu henüz tam olarak çözemedim, ancak bir ipucu, hatanın benim kullanımımla ilişkili olması. -m32 inşa ederken olduğudur.

Benim durumumda, sorun Ubuntu 12.04'ün 64 bitlik bir kurulumunu oluştururken libc6-dbg'nin (veya bileşenlerinin bazılarının) 32 bit sürümünün olmamasıdır.


Çözüm (benim durumum için)

Benim için, aşağıdaki komut işleri işler hale getirdi ...

sudo apt-get install libc6-dbg:i386

Bu, https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236 adresinde tartışılmaktadır.

Not: Paket libc6-dbg:i386Synaptic'te veya komutunun tamamlanmasıyla kullanılabilir bir seçenek olarak gösterilmez apt-get- ancak yine de oradaydı.


İlk önce yardıma ihtiyacınız olacak iyi bir değişiklik var: stackoverflow.com/a/7412698/86967
— nobar

bu doğru olarak işaretlenmelidir; buradaki :i386anahtar.
— Thomas Shields

Hile yapan 32 bit oldu!
— Cardin

1
Bu benim için çözdü .. Bu hatayı bir serseri makinede görüyordum. Diğer yorumcuların söylediği gibi, bu doğru olarak işaretlenmelidir. (libgc-dbg zaten bir valgrind bağımlılığı olarak kuruldu, hile yapan i386 idi)
— Ken

Bu cevap 32 bit ikili dosyaları ile doğru bir şekilde ilgilenmiştir. hata mesajında libc6-dbgzaten ima edildi valgrind.
— leesei

11

Tamam, libc6-dbg'yi bu şekilde yaptım

sudo apt-get install libc6-dbg

ve valgrind iyi çalışıyor gibi görünüyor.

Ubuntu forum bağlantısı sayesinde:

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


@ Goaler444 Az önce yaptım. Hatırlattığınız için teşekkürler.
— Ayusman

diğer cevap noktaları olarak, sudo apt-get install libc6-dbg:i386yapılması doğrulanacak ikili dosyaya bağlı olarak bir çözüm olabilir (64 bit - 32 bit).
— logoff

0

Çok uzun bir süre bununla mücadele ettim, -m32 modunda derlendi, ama eşekte bir acıydı, ayrıca örneğin -lcrypto kullanmak istersem, 32bit'te açılmış olmadığım için -m32'de derleyemedim .

Bu yüzden, genellikle libc6-dbg: i386 yüklemeyi öneren birçok benzer mesajı okudum ... Bu, -m32 için sorunu çözdüğünü düşünüyorum, ama aradığım şey değildi. Uzun bir süre sonra buna geldi: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

Bu yüzden dpkg -l libc6 * komutunu çalıştırmayı deneyin ve libc6-amd64 öğesini görürseniz bu size yardımcı olabilir. Ama dikkatlice okuyun esp. nokta 2, çünkü libc6-amd64 paketini kaldırdıktan sonra herhangi bir komutu kullanamayacaksınız, bu yüzden bir liveCD hazırlayın ve talimatları takip edin :) Sorunu çözmeme yardımcı oldu, ama yaklaşık 3 saat sürdü ve birkaç korku anı aldı . Bunu yapmadan önce verilerinizi yedeklemenizi tavsiye ederim, çünkü başarısız olursanız muhtemelen geri dönüş yolu olmayacaktır.

Ve 4. noktada dikkatli olun! Burada önerilen komutu yazamazsınız
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 çünkü canlı cd'de sembolik bir bağlantı kuracaktır/ klasöründe . Ayrıca lib64'e yazmak için kök haklarına sahip olmalısınız. Peki nasıl yaptım: (liveCD terminali aracılığıyla kırık valgrind diskimde / klasör açtım)

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

Umarım bir şey unutmadım ve bu yardımcı olacaktır.

Not: libc6-amd64 paketini kaldırmadan önce symlink'i değiştirmenin mümkün olup olmadığını merak ediyorum (tüm liveCD şeylerini atlarsınız) ama emin değilim.


Lütfen dilinizi izleyin !!!
— Panther
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.