Valgrind ทำการแก้ไขข้อผิดพลาด


18

ผมได้พยายามที่จะปฏิบัติตามกวดวิชาออนไลน์ เรียนรู้ C ฮาร์ด Way

อย่างไรก็ตามหลังจากตั้งค่า valgrind (ฉันติดตามลิงค์อื่น ๆ ที่ช่วยตั้งค่า valgrind บน Ubuntu 12.04) เมื่อฉันพยายามดีบักไฟล์ปฏิบัติการ c ฉันพบข้อผิดพลาดดังต่อไปนี้

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$ 

มีบางสิ่งที่ฉันสามารถทำได้เพื่อทำให้ valgrind ได้ผลในที่สุด?

ฉันมีอูบุนตู 12.04 บนกล่องเสมือน แล็ปท็อปของฉันคือระบบปฏิบัติการ Windows 7 64 บิต


valgrind ทำงานได้ดีสำหรับฉัน แต่ฉันไม่สามารถพูดได้ว่าห้องสมุดใดที่ฉันติดตั้งไว้แล้ว valgrind หาได้จาก repo คุณไม่จำเป็นต้องรวบรวมเหมือนเรียนรู้ C วิธีที่ยาก ติดตั้งจาก repo จะจัดการปัญหาการพึ่งพาสำหรับคุณ
RobotHumans

คำตอบ:


42

ฉันได้รับข้อความเดียวกันเป็นหลัก (ยกเว้นที่ld-linux-x86-64.so.2ถูกแทนที่ด้วยld-linux.so.2) ฉันติดตั้ง Valgrind โดยใช้apt-getดังนั้น libc6-dbg ได้รวมอยู่ในการอ้างอิงแล้ว

ฉันยังไม่ได้แก้ไขทั้งหมดนี้ แต่สิ่งที่บ่งบอกว่าข้อผิดพลาดนั้นสัมพันธ์กับการใช้งานของฉัน-m32เมื่อสร้าง

ดังนั้นดูเหมือนว่าในกรณีของฉันปัญหาคือการขาด libc6-dbg รุ่น 32 บิต (หรือส่วนประกอบบางส่วน) เมื่อสร้างบนการติดตั้ง Ubuntu 12.04 แบบ 64 บิต


โซลูชัน (สำหรับกรณีของฉัน)

สำหรับฉันแล้วคำสั่งต่อไปนี้ทำให้ทุกอย่างทำงานได้ ...

sudo apt-get install libc6-dbg:i386

เรื่องนี้มีการกล่าวถึงที่https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/881236

หมายเหตุ: แพคเกจlibc6-dbg:i386จะไม่แสดงเป็นตัวเลือกที่มีอยู่ใน Synaptic หรือผ่านคำสั่งเสร็จapt-get- แต่ก็มีอยู่แล้ว


มีการเปลี่ยนแปลงที่ดีที่คุณต้องการความช่วยเหลือในการสร้างก่อน: stackoverflow.com/a/7412698/86967
nobar

ควรทำเครื่องหมายว่าถูกต้อง :i386เป็นกุญแจสำคัญที่นี่
Thomas Shields

มันเป็น 32- บิตที่ทำอุบาย!
Cardin

1
วิธีนี้แก้ไขได้สำหรับฉัน .. ฉันเห็นข้อผิดพลาดนี้ในเครื่องร่อนเร่ ตามที่ผู้แสดงความเห็นคนอื่นกล่าวว่าควรทำเครื่องหมายว่าถูกต้อง (libgc-DBG ได้รับการติดตั้งไว้แล้วเป็นพึ่งพา valgrind มันเป็น i386 ที่ไม่หลอกลวง)
เคน

คำตอบนี้ตอบอย่างถูกต้องกับไบนารี 32 บิต libc6-dbgมีการบอกใบ้ในvalgrindข้อความแสดงข้อผิดพลาด
leesei

11

ตกลงฉันทำ intsall libc6-dbg อย่างนั้น

sudo apt-get install libc6-dbg

และ valgrind ดูเหมือนจะทำงานได้ดี

ขอบคุณที่ลิงค์ฟอรั่มอูบุนตู:

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


@ Goaler444 ฉันเพิ่งทำ ขอบคุณสำหรับการเตือน
Ayusman

ในฐานะที่เป็นจุดตอบอื่น ๆ การทำsudo apt-get install libc6-dbg:i386อาจเป็นวิธีแก้ปัญหาขึ้นอยู่กับไบนารีที่จะvalgrinded (64 บิตเทียบกับ 32 บิต)
ออกจากระบบ

0

ฉันต่อสู้กับสิ่งนี้มาเป็นเวลานานการคอมไพล์ในโหมด -m32 ทำงาน แต่มันก็เป็นความเจ็บปวดในตูดนอกจากนี้ถ้าฉันต้องการใช้เช่น -lcrypto ฉันไม่สามารถคอมไพล์ใน -m32 เพราะฉันไม่ได้มี openssl ใน 32 บิตติดตั้ง .

ดังนั้นฉันจึงอ่านบทความที่คล้ายกันจำนวนมากโดยปกติจะแนะนำให้ติดตั้ง libc6-dbg: i386 ... ฉันคิดว่านี่แก้ปัญหาได้สำหรับ -m32 แต่มันไม่ใช่สิ่งที่ฉันกำลังมองหา ดังนั้นหลังจากนานมาถึงนี้: https://lists.ubuntu.com/archives/foundations-bugs/2013-November/173202.html

ดังนั้นลองใช้ dpkg -l libc6 * และถ้าคุณเห็น libc6-amd64 สิ่งนี้จะช่วยคุณได้ แต่อ่านอย่างระมัดระวังโดยเฉพาะอย่างยิ่ง จุดที่ 2 ทำให้คุณไม่สามารถใช้คำสั่งใด ๆ หลังจากที่คุณนำแพคเกจ libc6-amd64 ออกดังนั้นให้เตรียม liveCD และทำตามคำแนะนำ :) มันช่วยให้ฉันแก้ปัญหาได้ แต่ใช้เวลาประมาณ 3 ชั่วโมงและช่วงเวลาที่น่ากลัว . ฉันแนะนำให้สำรองข้อมูลของคุณก่อนที่คุณจะทำเช่นนั้นเพราะถ้าคุณล้มเหลวอาจจะไม่มีทางกลับ

และระวังจุดที่ 4! คุณไม่สามารถเขียนคำสั่งที่แนะนำได้
ln -s /lib/x86_64-linux-gnu/ld-2.17.so /lib64/ld-linux-x86-64.so.2 เพราะมันจะทำให้การเชื่อมโยงสัญลักษณ์ในซีดีสด/โฟลเดอร์นอกจากนี้คุณต้องมีสิทธิ์รูทเพื่อเขียนไปยัง lib64 ดังนั้นวิธีที่ฉันทำคือ: (ฉันมี / โฟลเดอร์บนดิสก์ valgrind ที่หักของฉันเปิดผ่านเทอร์มินัล 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

หวังว่าฉันจะไม่ลืมอะไรเลยและนี่จะเป็นประโยชน์

PS: ฉันสงสัยว่ามันเป็นไปได้ที่จะเปลี่ยน symlink ก่อนที่คุณจะลบแพคเกจ libc6-amd64 (คุณจะข้ามสิ่ง liveCD ทั้งหมด) แต่ฉันไม่แน่ใจ


โปรดดูภาษาของคุณ !!!
Panther
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.