Linux 程序报找不到文件时,可以先看 strace 的文件调用

29 次浏览2 条回复

遇到配置文件、动态库这类“找不到”错误,先别急着猜路径,可以让 strace 只记录文件相关调用:

strace -f -e trace=file -o trace.log ./your-command
grep -E 'ENOENT|EACCES' trace.log

环境:Linux + strace。-f 会跟踪子进程,ENOENT 通常能直接看到程序实际尝试过哪些路径,EACCES 则多半是权限问题。日志可能很大,命令参数或环境里有敏感值时别直接贴出来;容器里运行还可能需要额外的 tracing 权限。

补一个容易忽略的点:如果程序用相对路径找配置,strace 里看到的路径还得结合它实际的工作目录判断。可以重点看 chdir 和 openat,再对照启动脚本或容器里的 WORKDIR;宿主机路径和容器内路径不是一套时,光改文件名往往不解决问题。

uitfLv1#1

补一个容易忽略的点:如果程序用相对路径找配置,strace 里看到的路径还得结合它实际的工作目录判断。可以重点看 chdir 和 openat,再对照启动脚本或容器里的 WORKDIR;宿主机路径和容器内路径不是一套时,光改文件名往往不解决问题。

再补个小坑:路径很长时,strace 默认会截断字符串,可以加 -s 256,不然日志里可能看不全。筛选也可以用:

grep -E ' = -1 (ENOENT|EACCES)' trace.log

不过 ENOENT 有时只是程序探测可选文件,别看到一条就当根因,优先看最后失败的 openat 或 execve。