我一直在尝试按照在线教程 艰难地学习 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 位操作系统。
答案1
我收到的消息基本相同(除了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
- 但无论如何它都在那里。
答案2
好的,我确实像这样安装了 libc6-dbg
sudo apt-get install libc6-dbg
并且 valgrind 似乎运行良好。
感谢 ubuntu 论坛链接:
答案3
我为此奋斗了很长时间,在 -m32 模式下编译成功了,但这很麻烦,而且如果我想使用例如 -lcrypto,我无法在 -m32 模式下编译,因为我没有安装 32 位 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
因为它会在 live cd/
文件夹中创建一个符号链接。此外,您必须拥有 root 权限才能写入 lib64。所以我的做法是:(我通过 liveCD 终端打开了损坏的 valgrind 磁盘上的 / 文件夹)
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
希望我没有忘记任何事情并且这将会有所帮助。
附言:我想知道在删除 libc6-amd64 包之前是否可以更改符号链接(您将绕过整个 liveCD 内容)但我不确定。