在 Ubuntu 下调试 opendir()(以及相关的目录操作,如 readdir()、closedir()),通常可以从代码层面、运行时错误、系统调用、工具辅助几个角度来做。下面给你一套实用方法。
opendir() 失败时返回 NULL,并设置 errno。
第一步永远是检查返回值 + errno。
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "usage: %s <dir>\n", argv[0]);
return 1;
}
DIR *dir = opendir(argv[1]);
if (dir == NULL) {
fprintf(stderr, "opendir failed: %s\n", strerror(errno));
return 1;
}
closedir(dir);
return 0;
}
常见 errno:
ENOENT:目录不存在EACCES:权限不足ENOTDIR:不是目录EMFILE / ENFILE:打开文件数过多gcc -g -o test_dir test_dir.c
gdb ./test_dir
break main
run /some/path
step
next
print dir
print errno
opendir() 底层是 openat() + getdents()。
strace ./test_dir /some/path
你会看到类似:
openat(AT_FDCWD, "/some/path", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = -1 ENOENT
非常直观,适合排查权限、路径、挂载问题。
ltrace ./test_dir /some/path
可以看到:
opendir("/some/path") = NULL
/ 一般没问题,但注意符号链接ls -ld /some/path
readlink -f /some/path
namei -l /some/path
opendir() 看不到宿主路径strace 确认实际访问路径opendir() 本身是线程安全的readdir() 不是(用 readdir_r() 或加锁)✅ 路径是否存在
✅ 是否是目录
✅ 是否有读权限
✅ 是否超过 fd 限制(ulimit -n)
✅ 是否符号链接循环
如果你愿意,可以把:
strace 输出贴出来,我可以帮你精确定位问题。