V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuelang
V2EX  ›  程序员

文件存在却报错: no such file or directory ,记录下调试过程

  •  
  •   xuelang ·
    selfboot · 166 天前 · 3086 次点击
    这是一个创建于 166 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前段时间遇见了一个奇怪的问题,在执行二进制文件 protoc 的时候,报错 no such file or directory: ./protoc 。文件明明就在那里,可是一直报这个错,莫不是系统有 bug 了?

    这里的二进制文件真实存在,检查权限也是对的,偏偏执行报错。第一次遇见这种问题,一时间都没有啥排查思路,这看起来就是根本不会发生的事。

    大家可以先猜猜可能有哪些原因,以及如何验证?


    在有 ChatGPT 之前,遇见解决不了的问题,就先去搜索引擎看看,搜索 no such file or directory but file exist ,有不少结果。这里第一个结果 No such file or directory? But the file exists! 比较匹配我的问题,在问题的高赞回答中,上来就给出了结论:可能是因为在不支持 32 位环境的 64 位机器中运行一个 32 位的二进制。具体到我的这个二进制文件,确实是从一个老的机器上拷到 64 位机器执行的。

    不过为啥这样就报错?怎么知道是这个原因的? ChatGPT 在排查问题中究竟能发挥多大的作用?

    完整内容在文章 ChatGPT 协助分析诡异的 no such file 问题

    28 条回复    2023-11-14 15:33:42 +08:00
    kkk9
        1
    kkk9  
       166 天前   ❤️ 6
    看见 GPT 直接关掉。😓
    lisxour
        2
    lisxour  
       166 天前
    linux 下,如果确认文件存在,基本都是位数导致的,linux 下这个提示很脑瘫。
    guanzhangzhang
        3
    guanzhangzhang  
       166 天前
    file 下它,还有 ldd 它看看
    alittlehj
        4
    alittlehj  
       166 天前
    文件是不是你代码创建的?如果是 有没有可能是并发问题,多个线程访问同一个文件?上一个线程刚删除了 下一个线程又来读了。
    xuelang
        5
    xuelang  
    OP
       166 天前
    @lisxour 这个提示确实很迷惑,不过也是因为底层 execve 返回的错误就这样,说的是找不到 ELF 链接器 文件
    xuelang
        6
    xuelang  
    OP
       166 天前
    @guanzhangzhang 起始这个问题,应该是 strace 看调用,才能排查到。。
    xuelang
        7
    xuelang  
    OP
       166 天前
    @alittlehj 哈哈,是我的错,没说清,这里查到原因了的,在博客有写的。
    xuelang
        8
    xuelang  
    OP
       166 天前
    @kkk9 怕不是对 ChatGPT 有啥误解吧,建议你多用用
    whoisnian
        9
    whoisnian  
       166 天前 via Android   ❤️ 1
    之前在 chroot 下跑 golang 程序也遇到了相同问题
    https://whoisnian.com/2023/10/17/%E5%9C%A8-chroot-jail-%E4%B8%AD%E8%BF%90%E8%A1%8CGolang%E7%A8%8B%E5%BA%8F/

    man 2 execve

    If the executable is a dynamically linked ELF executable, the interpreter named in the PT_INTERP segment is used to load the needed shared objects.
    This interpreter is typically /lib/ld-linux.so.2 for binaries linked with glibc (see ld-linux.so(8)).

    ENOENT The file pathname or a script or ELF interpreter does not exist.
    xuelang
        10
    xuelang  
    OP
       166 天前
    @whoisnian 对,完全一样的问题,第一次遇见比较懵
    kkk9
        11
    kkk9  
       166 天前
    @xuelang #8 谢谢建议,不用。
    listenerri
        12
    listenerri  
       166 天前   ❤️ 2
    前段时间遇到过这个问题,仔细分析了下,是跟 linux 动态链接器有关,关于动态链接器我博客里翻译了一篇挺好的文章:

    https://listenerri.com/2023/10/08/ld-so-linux-%E5%8A%A8%E6%80%81%E8%BF%9E%E6%8E%A5%E5%99%A8%E6%98%AF%E4%BB%80%E4%B9%88/

    我觉得 linux 报的找不到文件这个错误,并不是指找不到要执行的二进制文件,而是找不到二进制文件依赖的动态链接器 ld...so 文件
    julyclyde
        13
    julyclyde  
       166 天前
    @xuelang 我看了 @kkk9 的言论和你的博客,我觉得他说的对
    xuelang
        14
    xuelang  
    OP
       166 天前
    @julyclyde 嗯,希望有一天你不会觉得自己曾经错了
    xuelang
        15
    xuelang  
    OP
       166 天前
    @listenerri 对,看了你的文章,讲的不错啊。
    xuelang
        16
    xuelang  
    OP
       166 天前
    @kkk9 那就让时间来让你回心转意
    julyclyde
        17
    julyclyde  
       166 天前   ❤️ 4
    @xuelang 那不至于
    贵 GPT 并没有提供超出搜索引擎额外的信息量
    选 GPT 而不选搜索引擎,其实只是你为了满足自己“用上新鲜玩意”的虚荣心罢了
    对最终结果没什么影响
    rrfeng
        18
    rrfeng  
       166 天前
    说白了是 ENOENT 翻译成错误信息的时候不完善。
    xuelang
        19
    xuelang  
    OP
       166 天前
    @julyclyde 说真的,我真不屑于在这跟你辩论这个。
    xuelang
        20
    xuelang  
    OP
       166 天前
    @rrfeng 嗯嗯,是的
    sherlockwhite
        21
    sherlockwhite  
       166 天前
    @julyclyde #17 虚荣心。。真无语,多用用吧
    proxytoworld
        22
    proxytoworld  
       166 天前
    @julyclyde
    贵 GPT 并没有提供超出搜索引擎额外的信息量

    GPT 确实没有添加额外的知识量,但可以减小我检索知识的成本...
    matepi
        23
    matepi  
       166 天前
    我曾经碰到过类似的报错
    明明可执行文件存在,权限也正确,但在高级语言环境里面调用执行的时候就报
    cannot execute binary file
    一搜,都是说什么 32 位、64 位问题

    最后看了一堆,突然扫到别人写的/bin/sh -c ,才突然意识到自己错哪里了
    为了在非交互式 shell 里面加环境,都加了/bin/sh 等去加载环境、和长命令行处理
    然后错就错在/bin/sh -c 写成了/bin/sh -C (受 windows 兼容性 cmd /C ,一不注意写到 linux 的分支里也写了大写的-C )
    xuelang
        24
    xuelang  
    OP
       166 天前
    @matepi 你这个确实更加隐蔽,不好排查。
    wangybsyuct
        25
    wangybsyuct  
       166 天前
    根据你和网友的反馈,我是这样认为的。提示 no such file or directory: ./protoc ,你是使用什么工具执行去执行这个 protoc 的,自己的 shell ,或者 crontab ,或者是服务程序,或者是 webserver 里的一个点击,等等,这个很关键,因为你是使用了相对路径点撇./,这样执行一个程序是很省事,但是有隐患的,你使用了相对路径,相对谁呢?你在 shell 里,当然是相对于当前你运行的那个窗口的 shell ,其它的执行环境就不一定了。你在你当前 shell 窗口下执行正确(排除 32 位和 64 位和链接库的问题),那就看可能是执行环境的问题了
    julyclyde
        26
    julyclyde  
       166 天前   ❤️ 2
    @proxytoworld 只给出一个答案,但不一定是正确那个。你看 GPT 的话就断绝了获得更全面知识的可能性了,虽然省了时间
    xuelang
        27
    xuelang  
    OP
       166 天前
    @julyclyde 谁说 GPT 只给一个答案了? 另外,用 GPT 学习效率比搜索引擎快很多,获得知识也更全面的
    kkk9
        28
    kkk9  
       165 天前
    看了下后来的评论,没什么好争论的,我在 #1 发表的只是我个人意见。我回复的时候并没有点开链接,不过心里大概猜到了。点开看看,果然和猜测的一样,只不过是尬吹 GPT 在解决问题中的“所谓优势”。

    我个人看来,GPT 就和英汉字典一样的,有的人一辈子都离不开它,有的人学习阶段使用,后来就再也不用了。取决于什么人,也取决于怎么用。

    既然在 GPT 中提问要提炼问题,整理需求,引导它给出自己需要的答案,在没有 GPT 的时代里,你也是这样和搜索引擎对话的,搜索不理想,换个问法。那显然你并不比 GPT 蠢,你还要去验证方案,甚至可能还要和它掰扯(指正?)某些显而易见的错误。

    所以,在排查问题中发挥最大作用的就是你本人,你的大脑。用 GPT 并没有减少搜索成本,也没有增加自己的学习效率,甚至损失了在广阔知识中浏览时了解到其他知识的机会。

    > OP 原文:自从有了 ChatGPT ,平时遇到问题,第一反应都是拿来问 ChatGPT 。

    真正促进学习的仍然是人类自己,不要让自己的大脑萎缩了。如果有一天你的环境里没有 GPT 了,你还能保持学习吗?就像这个时代还剩下多少人坚持写字练字了?拿起笔手抖啊抖的?

    很多事情是方便了,可有些真正的本质也就丢了。

    提高自己的能力,推荐一本书籍 How To Ask Questions The Smart Way

    https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   874 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:09 · PVG 05:09 · LAX 14:09 · JFK 17:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.