Fork me on GitHub

4/20/2012

[Linux] Use Debugfs on Android

Android 在 user space 可以在 run-time 的時候透過 adb shell getprop/setprop 來動態讀寫變數。所以,kernel 開發的過程中,我在想有沒有類似的東西讓我可以動態的存取變數,這樣 debug 會方便許多。

於是,發現了 Linux 其實已經有提供一個 light-weight 的 filesystem 叫做 Debugfs, 正好可以滿足我的需求,紀錄一下使用方式。

  1. Enable Debug FileSystem

    Kernel hacking
        [*] Debug filesystem
    
    mount -t debugfs none /sys/kernel/debug // Do this manually
    
  2. Include header

    #include <linux/debugfs.h>
    
  3. Call the API to create dir and file, then put them into the module init func

    struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
    struct dentry *debugfs_create_u8(const char *name, mode_t mode, struct dentry *parent, u8 *value)
    
    static struct dentry *dbg_entry_dir, *dbg_entry_test;                                           
    u8 dbg_print_test = 0;
    
    static int debugfs_init(void) {
        dbg_entry_dir = debugfs_create_dir("test_debugfs", NULL);
        if (!dbg_entry_dir)
            return -1;
    
        dbg_entry_test = debugfs_create_u8("print_test", 0644, dbg_entry_dir, &dbg_print_test);
        if (!dbg_entry_test)
            return -1;
    
        return 0;
    }
    
  4. Remember to remove after module remove

    void debugfs_remove(struct dentry *dentry)
    
    debugfs_remove(dbg_entry_dir); // Put this in module remove func
    
  5. Use the filenode you create to debug

    adb shell cat sys/kernel/debug/test_debugfs/print_test
    
    adb shell;
    echo 1 > sys/kernel/debug/test_debugfs/print_test
    

Reference

Linux Debugfs文件系統介紹及使用

Debugfs

Linux内核里的DebugFS

Debugfs

Kernel debugging

-- EOF --

No comments:

Post a Comment