Linux之debugfs介绍

-----------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://blog.csdn.net/android_huber
交流邮箱:dp.shao@gmail.com
-----------------------------------------------------------------------

Linuxdebugfs介绍

Debugfs是一种用于内核调试的虚拟文件系统,在内核源码中经常可以看到它的使用,今天我来大概介绍一下它的使用。

如果你对debugfs不熟悉,那么也许你会对sysfs比较熟悉,对于调试方面,其实两个文件系统还是挺类似的,但是sysfs的引入内核主要是用于驱动模型的。所以我们在平时调试的时候应该尽量避免使用sysfs,而使用debugfs

好了,下面我们来介绍一些debugfs的使用,要使用debugfs首先我们要设置一下配置选项CONFIG_DEBUG_FS,可以在config文件中设置CONFIG_DEBUG_FS=y,也可以通过menuconfig来设置,如图:

Kernelhacking --->

            [*]Debug Filesystem

驱动中使用debugfs需要包含头文件<linux/debugfs.h>,为了在用户态下使用debugfs,必须把它mount到一个目录下,我们可以把它放在mnt目录下。

使用如下命令:

mount-t debugfs none /mnt

然后进入 /mnt后就可以看到我们在系统中创建的这些文件。

下面我们开始说一下如何在驱动中使用debugfs.

首先我们需要创建一个自己的目录,利用如下函数:

struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);

name 就是创建的目录的名字, parent 是该目录的父目录,如果是 NULL 的话,则所创建的目录就在 debugfs 的根目录,具体使用如下:

static struct dentry *binder_debugfs_dir_entry_root;
binder_debugfs_dir_entry_root= debugfs_create_dir("binder", NULL);

这样就会在debugfs的根目录下创建一个binder的目录,有了目录还需要有可供读写的文件吧,下边就是另一个重要的函数,文件的创建:

struct dentry *debugfs_create_file(const char *name, mode_t mode,
struct dentry *parent, void *data,
const struct file_operations *fops)

如其函数名,这个函数的作用就是在parent这个目录下创建一个名为name的文件,mode是这个文件读写权限,data是传入的参数,fops就比较重要了,为我们的文件提供实际的读写操作。

binder驱动中创建了如下文件

debugfs_create_file("state",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_state_fops);

debugfs_create_file("stats",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_stats_fops);

debugfs_create_file("transactions",
S_IRUGO,
binder_debugfs_dir_entry_root,
NULL,
&binder_transactions_fops);

debugfs_create_file("transaction_log",
S_IRUGO,
binder_debugfs_dir_entry_root,
&binder_transaction_log,
&binder_transaction_log_fops);

debugfs_create_file("failed_transaction_log",
S_IRUGO,
binder_debugfs_dir_entry_root,
&binder_transaction_log_failed,
&binder_transaction_log_fops);

如上图所示,在binder目录下创建了proc/state/stats/transactions/transaction_log/failed_transaction_log这些文件。

binder中这些文件的fops全部用一个宏来完成了

#define BINDER_DEBUG_ENTRY(name) \
static int binder_##name##_open(struct inode *inode, struct file *file) \
{\
return single_open(file, binder_##name##_show, inode->i_private); \
}\
\
static const struct file_operations binder_##name##_fops = { \
.owner= THIS_MODULE, \
.open= binder_##name##_open, \
.read= seq_read, \
.llseek= seq_lseek, \
.release= single_release, \
}

可以看到binder没有实现write操作。read则全部使用seq_file的操作,seq_file2.4.15以后版本的内核中出现的新功能,使得内核输出大文件信息。这边我们就不去将seq了,我们放在另外的一篇文章里面去讲。

debugfs除了实现这个文件对函数的功能,还提供了一些API用来针对变量的操作:

struct dentry *debugfs_create_u8(const char *name, mode_t mode, struct dentry *parent, u8 *value);
struct dentry *debugfs_create_u16(const char *name, mode_t mode, structdentry *parent, u16 *value);
struct dentry *debugfs_create_u32(const char *name, mode_t mode, structdentry *parent, u32 *value);
struct dentry *debugfs_create_bool(const char *name, mode_t mode, structdentry *parent, u32 *value);

这样就可以在用户态去调试内核变量value了。

当内核卸载时,debugfs并不会自动的去清除我们创建的这些文件,对于创建的每一个文件我们都需要调用如下函数接口去清除:

void debugfs_remove(struct dentry *dentry);


  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,debugfs是一个用于调试和恢复文件系统的工具。它可以用来修复或恢复由于文件系统损坏或其他问题而导致的目录丢失。 以下是使用debugfs恢复目录的基本步骤: 1. 首先,确保你具有root权限或者以root用户身份登录。 2. 卸载目标文件系统:使用umount命令卸载目标文件系统。例如,如果目标文件系统位于/dev/sda1上,可以使用以下命令卸载它: ``` umount /dev/sda1 ``` 3. 打开debugfs:使用以下命令打开debugfs,并指定目标设备: ``` debugfs /dev/sda1 ``` 4. 使用ls命令查看文件系统中的目录结构。你应该能够看到所有的文件和目录。 5. 使用cd命令进入包含被删除目录的父目录。例如,如果目标目录的父目录是/lost+found,可以使用以下命令进入该目录: ``` cd /lost+found ``` 6. 使用mkdir命令创建一个新的目录。例如,如果你想恢复一个名为"recovered_directory"的目录,可以使用以下命令创建它: ``` mkdir recovered_directory ``` 7. 使用quit命令退出debugfs。 8. 挂载文件系统:使用mount命令重新挂载文件系统,让恢复的目录生效。例如,如果目标文件系统位于/dev/sda1上,可以使用以下命令重新挂载它: ``` mount /dev/sda1 /mnt ``` 现在,你应该能够在挂载的文件系统中看到恢复的目录。 请注意,使用debugfs进行文件系统恢复需要非常小心,并且需要对文件系统的结构和操作有一定的了解。确保在进行任何操作之前备份重要数据,并在不确定的情况下寻求专业人士的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值