温馨提示×

debian readdir如何调试

小樊
42
2026-07-13 19:00:30
栏目: 智能运维

在 Debian(或其他 Linux)上调试 readdir,通常取决于你是在调试内核里的 readdir、glibc 里的 readdir,还是你自己写的用户态程序调用了 readdir。下面分情况说明。


一、最常见的场景:调试用户态程序里的 readdir

1️⃣ 用 strace 看系统调用(最常用)

readdir 在 glibc 里通常是用户态封装,真正干活的是 getdents / getdents64

strace -e getdents,getdents64 ./your_program

如果程序卡住或返回异常,可以看到:

  • 是否真的调用了 getdents
  • 返回了什么错误码(ENOENTEACCESEBADF 等)

这是定位 readdir 问题的首选方法


2️⃣ 用 ltrace 看库函数调用

ltrace ./your_program

可以看到:

readdir(0x...) = 0x...

适合确认:

  • readdir 是否真的被调用
  • 返回的 struct dirent * 是否为 NULL

3️⃣ 在代码中加调试信息(推荐)

#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 和错误

二、调试 glibc 里的 readdir

1️⃣ 安装 glibc 调试符号

sudo apt install libc6-dbg

2️⃣ 用 gdb 跟踪

gdb ./your_program
catch syscall getdents
run

或:

break readdir
run

然后:

backtrace
print errno

三、调试内核里的 readdir(进阶)

如果你怀疑是 文件系统 / 内核问题(比如 NFS、FUSE、ext4 bug):

1️⃣ 打开内核动态调试

mount -t debugfs none /sys/kernel/debug

然后(示例):

echo 'file fs/readdir.c +p' > /sys/kernel/debug/dynamic_debug/control

2️⃣ 查看内核日志

dmesg -w

四、常见 readdir 问题 & 调试技巧

问题 调试方法
readdir 返回 NULL 检查 errno
目录内容不完整 stracegetdents 返回
中文文件名乱码 确认 locale (locale -a)
NFS 目录卡住 strace + rpcdebug
权限问题 ls -ld + strace

五、快速定位 checklist ✅

  1. 先用 strace
    strace -e trace=file,getdents ./program
    
  2. 确认 errno
  3. 确认不是 EOF
  4. 必要时 gdb + libc6-dbg

如果你愿意,可以贴出:

  • 你的 Debian 版本
  • 文件系统类型(ext4 / NFS / FUSE)
  • 示例代码或报错信息

我可以帮你精确分析是哪一层的问题。

0