在 Debian(或其他 Linux)上调试 readdir,通常取决于你是在调试内核里的 readdir、glibc 里的 readdir,还是你自己写的用户态程序调用了 readdir。下面分情况说明。
readdirstrace 看系统调用(最常用)readdir 在 glibc 里通常是用户态封装,真正干活的是 getdents / getdents64。
strace -e getdents,getdents64 ./your_program
如果程序卡住或返回异常,可以看到:
getdentsENOENT、EACCES、EBADF 等)✅ 这是定位 readdir 问题的首选方法
ltrace 看库函数调用ltrace ./your_program
可以看到:
readdir(0x...) = 0x...
适合确认:
readdir 是否真的被调用struct dirent * 是否为 NULL#include <dirent.h>
#include <errno.h>
#include <stdio.h>
DIR *dir = opendir("/tmp");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("ino=%lu name=%s type=%d\n",
entry->d_ino,
entry->d_name,
entry->d_type);
}
if (errno != 0)
perror("readdir");
closedir(dir);
⚠️ 注意:
readdir 返回 NULL 不一定出错errno 才能区分 EOF 和错误readdirsudo apt install libc6-dbg
gdb ./your_program
catch syscall getdents
run
或:
break readdir
run
然后:
backtrace
print errno
readdir(进阶)如果你怀疑是 文件系统 / 内核问题(比如 NFS、FUSE、ext4 bug):
mount -t debugfs none /sys/kernel/debug
然后(示例):
echo 'file fs/readdir.c +p' > /sys/kernel/debug/dynamic_debug/control
dmesg -w
| 问题 | 调试方法 |
|---|---|
readdir 返回 NULL |
检查 errno |
| 目录内容不完整 | strace 看 getdents 返回 |
| 中文文件名乱码 | 确认 locale (locale -a) |
| NFS 目录卡住 | strace + rpcdebug |
| 权限问题 | ls -ld + strace |
strace -e trace=file,getdents ./program
如果你愿意,可以贴出:
我可以帮你精确分析是哪一层的问题。