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

2023-11-13 10:01:38 +08:00
 xuelang

前段时间遇见了一个奇怪的问题,在执行二进制文件 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 问题

3362 次点击
所在节点    程序员
28 条回复
kkk9
2023-11-13 10:28:18 +08:00
看见 GPT 直接关掉。😓
lisxour
2023-11-13 10:33:31 +08:00
linux 下,如果确认文件存在,基本都是位数导致的,linux 下这个提示很脑瘫。
guanzhangzhang
2023-11-13 11:06:57 +08:00
file 下它,还有 ldd 它看看
alittlehj
2023-11-13 11:32:02 +08:00
文件是不是你代码创建的?如果是 有没有可能是并发问题,多个线程访问同一个文件?上一个线程刚删除了 下一个线程又来读了。
xuelang
2023-11-13 11:40:33 +08:00
@lisxour 这个提示确实很迷惑,不过也是因为底层 execve 返回的错误就这样,说的是找不到 ELF 链接器 文件
xuelang
2023-11-13 11:40:55 +08:00
@guanzhangzhang 起始这个问题,应该是 strace 看调用,才能排查到。。
xuelang
2023-11-13 11:41:28 +08:00
@alittlehj 哈哈,是我的错,没说清,这里查到原因了的,在博客有写的。
xuelang
2023-11-13 11:42:10 +08:00
@kkk9 怕不是对 ChatGPT 有啥误解吧,建议你多用用
whoisnian
2023-11-13 12:13:11 +08:00
之前在 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
2023-11-13 12:47:49 +08:00
@whoisnian 对,完全一样的问题,第一次遇见比较懵
kkk9
2023-11-13 12:49:05 +08:00
@xuelang #8 谢谢建议,不用。
listenerri
2023-11-13 13:52:39 +08:00
前段时间遇到过这个问题,仔细分析了下,是跟 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
2023-11-13 14:03:14 +08:00
@xuelang 我看了 @kkk9 的言论和你的博客,我觉得他说的对
xuelang
2023-11-13 14:10:54 +08:00
@julyclyde 嗯,希望有一天你不会觉得自己曾经错了
xuelang
2023-11-13 14:12:09 +08:00
@listenerri 对,看了你的文章,讲的不错啊。
xuelang
2023-11-13 14:12:32 +08:00
@kkk9 那就让时间来让你回心转意
julyclyde
2023-11-13 14:30:32 +08:00
@xuelang 那不至于
贵 GPT 并没有提供超出搜索引擎额外的信息量
选 GPT 而不选搜索引擎,其实只是你为了满足自己“用上新鲜玩意”的虚荣心罢了
对最终结果没什么影响
rrfeng
2023-11-13 14:36:01 +08:00
说白了是 ENOENT 翻译成错误信息的时候不完善。
xuelang
2023-11-13 14:58:04 +08:00
@julyclyde 说真的,我真不屑于在这跟你辩论这个。
xuelang
2023-11-13 14:58:16 +08:00
@rrfeng 嗯嗯,是的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/991345

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX