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 на виртуальной коробке. Мой ноутбук - 64-битная ОС Windows 7.

Ayusman
источник
Valgrind отлично работал для меня из коробки, но я не могу сказать, какие библиотеки я уже установил. Valgrind доступен в репо. вам не нужно компилировать, это как учить C на сложном пути. установка из
репозитория решит

Ответы:

42

Я получил по существу то же самое сообщение (кроме того, что ld-linux-x86-64.so.2было заменено на ld-linux.so.2). Я установил Valgrind, используя apt-getlibc6-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- но он все равно был.

nobar
источник
Есть хорошее изменение, которое вам понадобится сначала для создания справки: stackoverflow.com/a/7412698/86967
nobar
это должно быть помечено как правильное; :i386является ключевым здесь.
Томас Шилдс
Это был 32-разрядный, который добился цели!
Cardin
1
Это решило это для меня .. Я видел эту ошибку на бродячей машине. Как говорили другие комментаторы, это должно быть помечено как правильное. (libgc-dbg уже была установлена ​​как зависимость от valgrind, именно i386 добился цели)
Ken
Этот ответ правильно относился к 32-разрядным двоичным файлам. libc6-dbgбыло уже намекается в valgrindсообщении об ошибке.
leesei
11

Хорошо, я сделал intsall libc6-dbg вот так

sudo apt-get install libc6-dbg

и Вальгринд, кажется, работает нормально.

Благодаря ссылке на форум Ubuntu:

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

Ayusman
источник
@ Goaler444 Я только что сделал. Спасибо за напоминание.
Ayusman
как и другие ответы, выполнение 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 потому что она создаст символическую ссылку в /папке live cd . Также вы должны иметь права root для записи в 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: Интересно, можно ли изменить символическую ссылку перед удалением пакета libc6-amd64 (вы бы пропустили весь материал liveCD), но я не уверен.

krumpac007
источник
Пожалуйста, следите за своим языком !!!
Пантера