Valgrind会调试错误


18

我一直在尝试遵循“ 学习C的艰难方法”的在线教程 。

但是,在设置valgrind之后(我遵循了有助于在ubuntu 12.04上设置valgrind的其他链接),当我尝试调试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最终起作用吗?

我在虚拟机上有ubuntu 12.04。我的笔记本电脑是Windows 7 64位操作系统。


valgrind对我来说开箱即用,但我不能说我已经安装了哪些库。valgrind可从回购中获得。您不需要编译就好比用困难的方式学习C一样。从repo安装将为您解决依赖性问题
RobotHumans 2012年

Answers:


42

我基本上得到了相同的消息(除了ld-linux-x86-64.so.2被替换为ld-linux.so.2)。我已经使用Valgrind安装了,apt-get因此libc6-dbg已经作为依赖项包含在内。

我还没有完全解决这个问题,但是有一个线索是错误与我-m32在构建时的使用有关。

因此,就我而言,似乎是在构建64位安装的Ubuntu 12.04时缺少32位版本的libc6-dbg(或其某些组件)。


解决方案(就我而言)

对我来说,以下命令使事情正常进行...

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 2013年

真正的诀窍是32位!
Cardin

1
这为我解决了..我在无业游民的机器上看到此错误。正如其他评论者所说,这应标记为正确。(libgc-dbg已作为valgrind依赖项安装,这是i386发挥了作用)

此答案正确处理了32位二进制文​​件。libc6-dbg已在valgrind的错误消息中得到提示。
leesei 2014年


0

我为此苦苦思索了很长时间,在-m32模式下工作正常,但是这很麻烦,而且,如果我想使用-lcrypto,那么我无法在-m32中进行编译,因为我没有在32bit上安装openssl 。

因此,我通读了很多类似的文章,通常建议安装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 因为它将在实时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内容),但是我不确定。


请注意你的语言!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.