Valgrind melakukan kesalahan debug

18

Saya telah mencoba mengikuti tutorial online untuk Learn C The Hard Way .

Namun setelah mengatur valgrind (saya mengikuti tautan lain yang membantu mengatur valgrind di ubuntu 12.04), ketika saya mencoba untuk men-debug c executable, saya menemukan kesalahan berikut.

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$ 

Apakah ada sesuatu yang bisa saya lakukan untuk membuat valgrind akhirnya berfungsi?

Saya memiliki ubuntu 12.04 di kotak virtual. Laptop saya adalah OS Windows 7 64 bit.

Ayusman
sumber
Valgrind bekerja dengan baik untuk saya di luar kotak, tetapi saya tidak bisa mengatakan perpustakaan apa yang sudah saya instal. valgrind tersedia dari repo. Anda tidak perlu mengkompilasi seperti belajar C dengan cara yang sulit. memasang dari repo akan menangani masalah ketergantungan untuk Anda
RobotHumans

Jawaban:

42

Saya mendapat pesan yang sama (kecuali ld-linux-x86-64.so.2diganti ld-linux.so.2). Saya telah menginstal Valgrind menggunakan apt-getjadi libc6-dbg sudah termasuk sebagai ketergantungan.

Saya belum sepenuhnya menyelesaikan ini, tetapi petunjuknya adalah bahwa kesalahan tersebut berkorelasi dengan penggunaan saya -m32saat membangun.

Jadi tampaknya, dalam kasus saya, masalahnya adalah kurangnya versi 32-bit libc6-dbg (atau beberapa komponennya), ketika membangun instalasi 64-bit Ubuntu 12.04.


Solusi (untuk kasus saya)

Bagi saya, perintah berikut ini membuat semuanya bekerja ...

sudo apt-get install libc6-dbg:i386

Ini dibahas di https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236

Catatan: Paket libc6-dbg:i386tidak muncul sebagai opsi yang tersedia di Synaptic atau melalui perintah-penyelesaian dari apt-get- tetapi tetap ada di sana.

bangsawan
sumber
Ada perubahan yang baik, Anda perlu bantuan membangun terlebih dahulu: stackoverflow.com/a/7412698/86967
nobar
ini harus ditandai sebagai benar; yang :i386adalah kunci di sini.
Thomas Shields
Itu 32-bit yang melakukan trik!
Cardin
1
Ini menyelesaikannya untuk saya .. Saya melihat kesalahan ini pada mesin gelandangan. Seperti kata komentator lain, ini harus ditandai sebagai benar. (libgc-dbg sudah diinstal sebagai dependensi valgrind, itu adalah i386 yang melakukan trik)
Ken
Jawaban ini ditangani dengan benar dengan binari 32bit. libc6-dbgsudah diisyaratkan dalam valgrindpesan kesalahan.
leesei
11

Ok, saya melakukan intsall libc6-dbg seperti itu

sudo apt-get install libc6-dbg

dan valgrind tampaknya berfungsi dengan baik.

Berkat tautan forum ubuntu:

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

Ayusman
sumber
@ Goaler444 Saya baru saja melakukannya. Terima kasih telah mengingatkan.
Ayusman
sebagai titik jawaban lainnya, melakukan sudo apt-get install libc6-dbg:i386bisa menjadi solusi tergantung pada biner yang akan di- valgrinded (64 bit vs 32 bit).
logoff
0

Saya berjuang dengan ini untuk waktu yang sangat lama, mengkompilasi dalam mode -m32 bekerja, tapi itu menyebalkan, apalagi jika saya ingin menggunakan misalnya -lcrypto, saya tidak bisa mengkompilasi di -m32 karena saya tidak memiliki openssl dalam 32bit diinstal .

Jadi saya membaca banyak posting serupa, biasanya menyarankan menginstal libc6-dbg: i386 ... Saya pikir ini menyelesaikan masalah untuk -m32, tapi bukan itu yang saya cari. Jadi setelah sekian lama a datang ke ini: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

Jadi coba jalankan dpkg -l libc6 * dan jika Anda melihat libc6-amd64, ini bisa membantu Anda. Tapi baca dengan seksama esp. poin 2, karena Anda tidak akan dapat menggunakan perintah apa pun setelah Anda menghapus paket libc6-amd64, jadi siapkan liveCD dan ikuti instruksi :) Ini membantu saya menyelesaikan masalah, tetapi butuh waktu sekitar 3 jam dan beberapa momen ketakutan . Saya sarankan untuk mencadangkan data Anda sebelum Anda melakukannya, karena jika Anda gagal, mungkin tidak ada jalan kembali.

Dan berhati-hatilah pada poin 4! Anda tidak dapat cukup menulis perintah yang disarankan di sana
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 karena itu akan membuat tautan simbolik di /folder live cd . Anda juga harus memiliki hak root untuk menulis ke lib64. Jadi bagaimana saya melakukannya adalah: (saya punya / folder pada disk valgrind saya yang rusak dibuka melalui 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

Semoga saya tidak melupakan apa pun dan ini akan membantu.

PS: Saya ingin tahu apakah mungkin untuk mengubah symlink sebelum Anda menghapus paket libc6-amd64 (Anda akan mem-bypass seluruh liveCD) tetapi saya tidak yakin.

krumpac007
sumber
Silakan perhatikan bahasa Anda !!!
Panther