Valgrind робить помилку налагодження


18

Я намагався дотримуватися онлайн-підручника для Learn C The Hard 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$ 

Чи є щось, що я можу зробити, щоб вальгринд нарешті спрацював?

У мене є віртуальна скринька ubuntu 12.04. Мій ноутбук - це ОС Windows 7 64 біт.


valgrind працював для мене чудово, але я не можу сказати, які бібліотеки я вже встановив. valgrind доступний від repo. вам не потрібно компілювати, це як вивчити C твердий шлях. Установка з репо буде вирішувати питання залежності від вас
RobotHumans

Відповіді:


42

Я отримав по суті те саме повідомлення (за винятком того, що ld-linux-x86-64.so.2його замінили ld-linux.so.2). Я встановив Valgrind, використовуючи, apt-getтаким чином, libc6-dbg вже включався як залежність.

Я ще не повністю вирішив це, але підказка полягає в тому, що помилка корелює з моїм використанням -m32при будівництві.

Тож здавалося б, що в моєму випадку проблема полягає у відсутності 32-бітної версії libc6-dbg (або деяких її компонентів) при побудові на 64-бітній установці Ubuntu 12.04.


Рішення (для мого випадку)

Для мене наступна команда змусила справи працювати ...

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є ключовим тут.
Томас Шилдс

Саме 32-бітний трюк зробив!
Карден

1
Це вирішило це для мене .. Я бачив цю помилку на бродячому апараті. Як сказали інші коментатори, це слід позначити як правильне. (libgc-dbg вже встановлено як велика залежність; саме i386 зробив трюк)
Кен

Ця відповідь правильно стосувалася 32-бітових бінарних файлів. libc6-dbgвже було натякано на valgrindповідомлення про помилку.
leesei

11

Добре, я робив подібні inball libc6-dbg

sudo apt-get install libc6-dbg

а валгрінд, здається, працює добре.

Завдяки посиланню на форум ubuntu:

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


@ Goaler444 Я щойно зробив. Дякуємо за нагадування.
Аюсман

Як і інші пункти відповіді, це sudo apt-get install libc6-dbg:i386може бути рішенням залежно від двійкового коду, який має бути зафіксований (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 оскільки це зробить символічне посилання у /папці з компакт- диском. Також ви повинні мати права root, щоб писати на lib64. Отже, як я це зробив: (у мене / папка на моєму розбитому вальдрінд-диску відкрилася через термінал 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: Цікаво, чи можна змінити симпосилання перед тим, як видалити пакунок libc6-amd64 (ви обійшли би всі речі LiveCD), але я не впевнений.


Будь ласка, дивіться свою мову !!!
Пантера
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.