在 CentOS(或其他 Linux 系统)上调试 readdir 相关问题,通常可以从系统调用层面、代码层面、文件系统层面三个方向入手。下面给你一套比较实用的调试方法。
常见的“readdir”有几种:
readdir()(<dirent.h>)readdir_r()(已废弃)getdents() / getdents64()ls 实际也是用 getdents调试方式会根据层面不同而不同。
strace -f -e trace=file ./your_program
只看目录读取:
strace -e trace=getdents,getdents64,open,openat,stat ./your_program
示例输出:
openat(AT_FDCWD, "/tmp", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 3
getdents64(3, /* 10 entries */, 32768) = 1024
✅ 用来确认:
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
int main() {
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("name=%s, type=%d\n", entry->d_name, entry->d_type);
}
if (errno != 0) {
perror("readdir");
}
closedir(dir);
return 0;
}
✅ 检查返回值
opendir() 失败 → perrorreaddir() 返回 NULL 时:
errno == 0 → 目录读完errno != 0 → 出错✅ 打印 d_type
entry->d_type == DT_DIR
entry->d_type == DT_REG
gdb ./your_program
在 readdir 处下断点:
break readdir
run
step
print entry
如果是静态链接:
break __readdir
ls -la /path
stat /path
mount | grep path
某些文件系统(NFS、FUSE)readdir 行为不同。
dmesg | tail
| 问题 | 原因 |
|---|---|
| readdir 返回 NULL | 目录读完或出错 |
| 少文件 | NFS / 缓存 / 权限 |
| 顺序不对 | readdir 不保证顺序 |
| 中文乱码 | locale 问题 |
| 性能慢 | 目录太大 / getdents 频繁 |
你可以告诉我:
cat /etc/redhat-release)我可以给你更精确的调试方案。