Valgrind /usr/lib 文件不是常规 Linux 文件

Valgrind /usr/lib 文件不是常规 Linux 文件

我今天遇到的问题(在带有 Linux 的嵌入式设备上)是一些文件(特别是 Valgrind/usr/lib文件)的行为非常奇怪,并且它们无法复制scp(错误是not a regular file:)。

所以:

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux
-rwxr-xr-x    1 root     root       1910732 Jun  6  2014 callgrind-x86-linux
-rw-r--r--    1 root     root         28429 Jun  6  2014 default.supp
-rwxr-xr-x    1 root     root       1884080 Jun  6  2014 drd-x86-linux
-rwxr-xr-x    1 root     root       1770688 Jun  6  2014 exp-bbv-x86-linux
-rwxr-xr-x    1 root     root       1852668 Jun  6  2014 exp-ptrcheck-x86-linux
-rwxr-xr-x    1 root     root       1910200 Jun  6  2014 helgrind-x86-linux
-rwxr-xr-x    1 root     root       1778880 Jun  6  2014 lackey-x86-linux
-rwxr-xr-x    1 root     root       1792524 Jun  6  2014 massif-x86-linux
-rwxr-xr-x    1 root     root       1942904 Jun  6  2014 memcheck-x86-linux
-rwxr-xr-x    1 root     root       1766560 Jun  6  2014 none-x86-linux
-rwxr-xr-x    1 root     root          2620 Jun  6  2014 vgpreload_core-x86-linux.so
-rwxr-xr-x    1 root     root         65296 Jun  6  2014 vgpreload_drd-x86-linux.so
-rwxr-xr-x    1 root     root         17904 Jun  6  2014 vgpreload_exp-ptrcheck-x86-linux.so
-rwxr-xr-x    1 root     root         37908 Jun  6  2014 vgpreload_helgrind-x86-linux.so
-rwxr-xr-x    1 root     root         15128 Jun  6  2014 vgpreload_massif-x86-linux.so
-rwxr-xr-x    1 root     root         26652 Jun  6  2014 vgpreload_memcheck-x86-linux.so

首先,请注意它们的名称中没有“valgrind”字符串。

然后,它们显示为常规文件(不是管道,不是设备)。但是,非常奇怪的是,它们并不是通过简单的方法找到的ls

$ ls -al /usr/lib/memcheck-x86-linux
ls: /usr/lib/memcheck-x86-linux: No such file or directory

它们甚至没有出现在常规列表中:

$ ls -al /usr/bin
(snipped)

Linux 上什么会导致这种行为?

此外,设备上没有像“文件”这样的实用程序,但我怀疑这对我有多大帮助。

输出df

$ df
Filesystem           1024-blocks    Used Available Use% Mounted on
/dev/root               980308    175548    754964  19% /
tmpfs                    10240       112     10128   1% /dev
tmpfs                   246728         0    246728   0% /tmp
tmpfs                     2048        12      2036   1% /var/log
tmpfs                   246728       128    246600   0% /dev/shm
tmpfs                   246728         0    246728   0% /run
tmpfs                   246728        20    246708   0% /var/run

所以,/是一个设备。

和:

$ whoami
root

所以,我是根。

只是为了完成拼图:

$ ls -al /dev/root
ls: /dev/root: No such file or directory

所以映射的设备并不真正存在。

答案1

这个输出:

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux

表示您正在列出一个名为/usr/lib/*valgrind*(很可能只是/usr/lib/valgrind)的目录。最大的线索是您看到.和 的目录条目..

这解释了为什么ls -al /usr/lib/memcheck-x86-linux说该文件不存在 - 这是因为该文件被称为/usr/lib/valgrind/memcheck-x86-linux.

如果您不想列出目录并将它们显示为一个条目,请将标志添加-dls

$ ls -ald /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 /usr/lib/valgrind

至于为什么scp说“不是常规文件”,因为您没有提供命令scp行或输出,我必须猜测,但我的猜测是,这是您scp为不是任何类型的文件的参数生成的输出根本不存在,因为它不存在。

答案2

虽然迈克尔·荷马已经写过什么发生了,这里是为什么它发生了(考虑到你对他的回答的评论,我想你已经知道了,但其他人遇到这个问题可能不会)。

您发出的命令是

ls -al /usr/lib/*valgrind*

甚至在执行 ls 之前,shell 就会解释星号,将其替换为与模式匹配的文件名列表。现在,如果只有一个匹配的名称(例如,/usr/lib/valgrind),那么列表当然将仅包含该名称。所以实际执行的命令是

ls -al /usr/lib/valgrind

现在 ls 将看到它被赋予了一个参数,并且检查该单个参数表明它是一个目录。由于您没有给出该-d选项,因此对于目录名称,它不会列出目录的条目,而是列出目录的内容。而且由于只给出了单身的目录名,它也不会首先打印目录名(因为如果您给出单个目录名作为参数,那么毫无疑问列出的文件属于哪个目录;记住,它ls不知道目录名来自文件名扩展)。

如果您想知道目录的实际名称(请记住,文字/usr/lib/valgrind是一个猜测(尽管很可能是一个);也可能是/usr/lib/valgrind-3.7),您可以使用

ls -ald /usr/lib/*valgrind*

另请注意,如果碰巧有额外的隐藏目录.valgrind或隐藏文件(如.valgrind-fooin )/usr/lib,它将不是ls尽管有选项,但仍会由您的命令显示-a,因为 shell 扩展不关心您提供给 的选项ls,并且ls不知道您也想查看这些文件,因为它们不包含在您的文件列表中。因此,如果您想确保点文件也被列出,您必须使用:

ls -ld /usr/lib/*valgrind* /usr/lib/.*valgrind*

请注意,这-a不是此处需要,因为作为参数给出的点文件由 . 无条件列出ls。当然,如果您想列出valgrind名称中包含的任何目录的内容,包括点文件,您将要需要-a,因为这些点文件在扩展后不会出现在命令行上。也就是说,在这种情况下你会使用

ls -la /usr/lib/*valgrind* /usr/lib/.*valgrind*

另一方面,如果您对匹配的目录内容感兴趣.*valgrind*,但对其中包含的点文件不感兴趣,则不会使用-a.

如果您正在使用bash(也可能适用于其他 shell,但我不确定),您可以将前两个命令简化为

ls -ld /usr/lib/{,.}*valgrind*

分别

ls -la /usr/lib/{,.}*valgrind*

相关内容