debugfs:Linux 內核調試的利器

目錄

  • 一、什么是 debugfs?
  • 二、debugfs 的配置和啟用方式
    • 2.1 內核配置選項
    • 2.2 掛載 debugfs
    • 2.3 Android 系統中的 debugfs
  • 三、debugfs 的典型應用場景
    • 3.1 調試驅動開發
    • 3.2 內核子系統調試
    • 3.3 性能分析
  • 四、常見 debugfs 子目錄與功能示例
    • 4.1 /sys/kernel/debug/tracing - 內核跟蹤核心目錄
    • 4.2 /sys/kernel/debug/gpio - GPIO 狀態調試
    • 4.3 /sys/kernel/debug/regulator - 電源調節器狀態
    • 4.4 /sys/kernel/debug/dma_buf - DMA buffer 分析
    • 4.5 /sys/kernel/debug/<自定義驅動名>/
  • 五、調試案例:自定義驅動中使用 debugfs
  • 六、debugfs 的工作原理和核心機制
  • 七、核心 API 總覽
  • 八、線上環境下的注意事項與安全性問題
    • 8.1 信息泄露風險
    • 8.2 系統穩定性風險
    • 8.3 Android 安全限制節
  • 九、補充:debugfs 與 procfs、sysfs 的區別


一、什么是 debugfs?

debugfs 是 Linux 內核提供的一個專用文件系統,主要用于內核與用戶空間之間的調試信息交換。它為內核開發人員或者驅動開發者提供了一種無需修改內核代碼即可獲取內部狀態的方式。

相比 /proc 和 /sys,debugfs 更偏向臨時調試用途,適合暴露實驗性、不穩定或僅用于開發階段的接口。

特點

動態創建、無需重新編譯內核。
文件操作接口簡單,可通過 shell 腳本或 C 語言輕松操作。
開發者常用于調試驅動、查看內部狀態、動態注入參數等。


二、debugfs 的配置和啟用方式

2.1 內核配置選項

要使用 debugfs,首先需要在編譯內核時啟用支持:

CONFIG_DEBUG_FS=y

如果你使用的是 Android 或嵌入式系統,也可在 menuconfig 中啟用:

Kernel hacking  --->  
[*] Debug Filesystem

此選項默認對主線內核是開啟的,但某些發行版或定制系統可能關閉以減小體積或提高安全性。

2.2 掛載 debugfs

一般系統啟動時不會自動掛載 debugfs,你可以手動掛載:

sudo mount -t debugfs none /sys/kernel/debug

也可以在啟動腳本中加入自動掛載邏輯:

if ! mountpoint -q /sys/kernel/debug; then  mount -t debugfs none /sys/kernel/debug
fi

驗證:

 ls /sys/kernel/debug/

輸出類似如下則表示掛載成功:

bdi/  clk/  gpio/  tracing/  suspend_stats  ...

2.3 Android 系統中的 debugfs

Android 默認處于安全模式,大多數生產環境中是關閉的。可以通過如下方式在開發版系統中開啟:

adb shell
mount -t debugfs debugfs /sys/kernel/debug

部分 Android 內核會禁用 CONFIG_DEBUG_FS,需要通過修改 kernel defconfig 啟用并重新編譯。

三、debugfs 的典型應用場景

debugfs 通常用于以下幾個方面:

3.1 調試驅動開發

我們可以將調試信息、參數、狀態變量通過 debugfs 暴露出來,便于動態查看或調整,而無需反復修改內核代碼、重啟內核。例如:

讀取設備寄存器
控制調試開關(如 loglevel)
查看緩存、狀態統計信息等

3.2 內核子系統調試

很多內核子系統默認就通過 debugfs 暴露接口,例如:

tracing(ftrace)
gpio 狀態查看與操作
regulator 狀態與調節
DMA buf debug 信息
audio 子系統的 debug log(如 asoc)

3.3 性能分析

結合 ftrace(內核函數跟蹤器)可以做函數調用路徑分析、系統延遲檢測、實時調試。


四、常見 debugfs 子目錄與功能示例

4.1 /sys/kernel/debug/tracing - 內核跟蹤核心目錄

這是 ftrace 的主目錄,可以分析函數調用、調度、延遲等。常見文件:

available_tracers:可用的跟蹤器類型
current_tracer:當前啟用的跟蹤器
trace:跟蹤結果輸出
set_ftrace_filter:設置要跟蹤的函數

示例:

# 開啟函數跟蹤
echo function > /sys/kernel/debug/tracing/current_tracer
# 查看 trace 日志
cat /sys/kernel/debug/tracing/trace

4.2 /sys/kernel/debug/gpio - GPIO 狀態調試

查看系統中所有 GPIO 控制器和當前引腳狀態:

cat /sys/kernel/debug/gpio

輸出類似:

gpiochip0: GPIOs 0-31, parent: platform/10012000.gpio, gpio-controller 
gpio-4   (sysfs               ) out hi    
gpio-17  (wifi_power         ) out lo    

4.3 /sys/kernel/debug/regulator - 電源調節器狀態

可查看/調試 regulator 驅動注冊的電壓、狀態等:

cat /sys/kernel/debug/regulator/ */status
cat /sys/kernel/debug/regulator/ */microvolts

4.4 /sys/kernel/debug/dma_buf - DMA buffer 分析

可用于分析圖形子系統中共享內存的引用情況:

cat /sys/kernel/debug/dma_buf/bufinfo

4.5 /sys/kernel/debug/<自定義驅動名>/

我們可以調用 debugfs_create_* 系列 API 在這里創建自己的調試目錄和接口,支持暴露:

整數、布爾變量
文件接口(read/write)
二進制 blob(例如 buffer dump)


五、調試案例:自定義驅動中使用 debugfs

一個簡單的例子:假如我們正在開發一個字符設備驅動,需要調試內部狀態:

#include <linux/debugfs.h>
static struct dentry *debug_dir;
static u32 debug_val = 0;
static int __init mydrv_init(void)
{debug_dir = debugfs_create_dir("mydrv", NULL);if (!debug_dir)return -ENOMEM;debugfs_create_u32("debug_val", 0644, debug_dir, &debug_val);return 0;
}
static void __exit mydrv_exit(void)
{debugfs_remove_recursive(debug_dir);
}

加載驅動后可直接查看或設置:

cat /sys/kernel/debug/mydrv/debug_val
echo 42 > /sys/kernel/debug/mydrv/debug_val

這比 printk + 重編譯 + 重啟流程更高效,尤其適合頻繁調試場景。


六、debugfs 的工作原理和核心機制

debugfs 實際上是一個虛擬文件系統(Virtual File System, VFS),類似于 /proc/sys,其底層由內核代碼負責維護和注冊。

它的本質是
內核將特定結構體變量映射為文件或目錄,通過 file_operations 讓用戶空間可以讀寫這些內核變量或結構體。

關鍵實現機制

  • debugfs_create_*() 系列 API 用于創建虛擬文件
  • 每個文件背后對應一個 file_operations,封裝了 read/write 行為
  • 這些文件操作最終在 debugfs 掛載點下暴露給用戶空間

例如,debugfs_create_u32("val", 0644, parent, &var) 就等價于暴露了一個變量 var 到文件系統中,可以直接讀寫。模塊注冊結構圖如下:
在這里插入圖片描述


七、核心 API 總覽

基本語法格式:

API名稱功能
debugfs_create_dir(name, parent)創建子目錄
debugfs create file(name, mode, parent, data, fops)創建具備操作函數的文件
debugfs_create_u32(name, mode, parent, ptr)綁定變量為 u32 文件
debugfs_create bool(name, mode, parent, ptr)創建布爾值控制項
debugfs_remove(entry)刪除單個debugfs項
debugfs_remove_recursive(entry)遞歸刪除整個目錄樹

示例:綁定一個只讀的布爾變量

static bool debug_flag = true;
debugfs_create_bool("enable_debug", 0444, parent_dir, &debug_flag);

用戶空間讀取:

cat /sys/kernel/debug/mydrv/enable_debug

雖然 debugfs 極大地方便了開發與調試,但在生產環境下要慎用或禁用,主要原因包括:

八、線上環境下的注意事項與安全性問題

8.1 信息泄露風險

  • debugfs 會暴露大量內核內部信息,黑客或惡意程序可借此探測系統結構。
  • 某些接口甚至允許直接寫入數據,可能對系統穩定性產生影響。

8.2 系統穩定性風險

  • 由于很多 debugfs 文件由開發者編寫,若實現不嚴謹可能導致 panic。
  • 示例:越界訪問、沒有加鎖保護、引用了已釋放的結構體等。

8.3 Android 安全限制節

  • Android 生產版默認關閉 debugfs
  • SELinux 和 seccomp 等機制會阻止其掛載

推薦的安全策略:

  • 線上系統關閉 CONFIG_DEBUG_FS,從內核構建階段禁止。
  • 或者通過配置掛載權限為只讀,并結合 SELinux 限制訪問。
  • 對自定義 debugfs 文件做好訪問控制,嚴格限制 read/write 權限。

九、補充:debugfs 與 procfs、sysfs 的區別

特性debugfsprocfssysfs
主要用途調試/開發進程信息內核對象模型
是否穩定否(可變)
是否推薦線上啟用
是否支持驅動自定義接口支持支持但復雜支持但需 class/device

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80107.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lua 作為嵌入式設備的配置語言

從lua的腳本中獲取數據 lua中棧的索引 3 | -1 2 | -2 1 | -3 可以在lua的解釋器中加入自己自定的一些功能,其實沒啥必要,就是為了可以練習下lua

棋牌室臺球室快速接入美團團購接口

北極星平臺從2024年12月份開始慢慢關閉&#xff0c;現在很多開發者反饋北極星token已經不能刷新了&#xff0c;全部遷移到美團團購綜合平臺。 申請這個平臺要求很高 1、保證金費用要15萬起步 2、平臺必須是二級等保和安全產品 &#xff0c;一個二級等保費用10萬起步 所以很多…

開源輕量級地圖解決方案leaflet

Leaflet 地圖&#xff1a;開源輕量級地圖解決方案 Leaflet 是一個開源的 JavaScript 庫&#xff0c;用于在網頁中嵌入交互式地圖。它以輕量級、靈活性和易用性著稱&#xff0c;適用于需要快速集成地圖功能的項目。以下是關于 Leaflet 的詳細介紹和使用指南。 1. Leaflet 的核心…

一個批量文件Dos2Unix程序(Microsoft Store,開源)1.1.0 編碼檢測和預覽

之前的版本是個意思意思&#xff0c;驗證商店發布的&#xff08;其實是我以前自己用的工具&#xff09;&#xff0c;這次把格式檢查和轉換都做上了&#xff0c;功能應該差不多了&#xff0c;還有一些需要小改進的地方。 因為還沒什么用戶嘛&#xff0c;還是保持全功能免費試用。…

特征提取:如何從不同模態中獲取有效信息?

在多模態學習中&#xff0c;不同模態&#xff08;文本、圖像、語音、視頻、傳感器數據等&#xff09;所攜帶的信息豐富且互補。但不同模態的數據結構、表示空間、時空分布截然不同&#xff0c;因此&#xff0c;如何對各模態進行高效、有效的特征提取&#xff0c;是整個多模態學…

Go語言爬蟲系列教程 實戰項目JS逆向實現CSDN文章導出教程

爬蟲實戰&#xff1a;JS逆向實現CSDN文章導出教程 在這篇教程中&#xff0c;我將帶領大家實現一個實用的爬蟲項目&#xff1a;導出你在CSDN上發布的所有文章。通過分析CSDN的API請求簽名機制&#xff0c;我們將繞過平臺限制&#xff0c;獲取自己的所有文章內容&#xff0c;并以…

交叉熵損失函數,KL散度, Focal loss

交叉熵損失函數&#xff08;Cross-Entropy Loss&#xff09; 交叉熵損失函數&#xff0c;涉及兩個概念&#xff0c;一個是損失函數&#xff0c;一個是交叉熵。 首先&#xff0c;對于損失函數。在機器學習中&#xff0c;損失函數就是用來衡量我們模型的預測結果與真實結果之間…

149.WEB滲透測試-MySQL基礎(四)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;148.WEB滲透測試-MySQL基礎&#xff08;三&#xff09; 非關系型數據庫&#xff1a; &a…

c/c++中程序內存區域的劃分

c/c程序內存分配的幾個區域&#xff1a; 1.棧區&#xff1a;在執行函數時&#xff0c;函數內局部變量的存儲單元都可以在棧上創建&#xff0c;函數執行結束時這些存儲單元自動被釋放&#xff0c;棧內存分配運算內置于處理器的指令集中&#xff0c;效率很高但是分配的內存容量有…

構建穩定的金字塔模式生態:從自然法則到系統工程

在自然界中&#xff0c;金字塔結構廣泛存在于生態系統之中&#xff0c;表現為營養級能量金字塔、生物量金字塔和數量金字塔等形式。這種結構不僅形象地描述了生態能量流轉的規律&#xff0c;也體現出生態系統中“穩定性”與“層級性”的天然法則。在現代軟件架構、企業組織、平…

Vue 3.0雙向數據綁定實現原理

Vue3 的數據雙向綁定是通過響應式系統來實現的。相比于 Vue2&#xff0c;Vue3 在響應式系統上做了很多改進&#xff0c;主要使用了 Proxy 對象來替代原來的 Object.defineProperty。本文將介紹 Vue3 數據雙向綁定的主要特點和實現方式。 1. 響應式系統 1.1. Proxy對象 Vue3 …

TIP-2021《SRGAT: Single Image Super-Resolution With Graph Attention Network》

推薦深藍學院的《深度神經網絡加速&#xff1a;cuDNN 與 TensorRT》&#xff0c;課程面向就業&#xff0c;細致講解CUDA運算的理論支撐與實踐&#xff0c;學完可以系統化掌握CUDA基礎編程知識以及TensorRT實戰&#xff0c;并且能夠利用GPU開發高性能、高并發的軟件系統&#xf…

大語言模型與多模態模型比較

一、核心差異&#xff1a;輸入數據類型與模態融合 輸入數據類型 LLM&#xff1a;僅處理文本數據&#xff0c;例如文本分類、機器翻譯、問答等任務&#xff0c;通過大規模語料庫學習語言規律。 LMM&#xff1a;支持文本、圖像、音頻、視頻等多種模態輸入&#xff0c;例如根據圖…

Apache HttpClient 5 用法-Java調用http服務

Apache HttpClient 5 核心用法詳解 Apache HttpClient 5 是 Apache 基金會推出的新一代 HTTP 客戶端庫&#xff0c;相比 4.x 版本在性能、模塊化和易用性上有顯著提升。以下是其核心用法及最佳實踐&#xff1a; 一、添加依賴 Maven 項目&#xff1a; <dependency><…

基于 Spark 的流量統計

一、引言 在互聯網行業&#xff0c;流量統計是分析網站或應用用戶行為、評估業務表現、優化資源分配以及制定營銷策略的關鍵環節。借助 Apache Spark 強大的分布式數據處理能力&#xff0c;我們可以高效地對大規模的流量數據進行統計分析&#xff0c;獲取有價值的洞察。本文將…

Python模塊化編程進階指南:從基礎到工程化實踐

一、模塊化編程核心原理與最佳實踐 1.1 模塊化設計原則 根據企業級項目實踐&#xff0c;模塊化開發應遵循以下核心原則&#xff1a; ??單一職責原則??&#xff1a;每個模塊只承擔一個功能域的任務&#xff08;如用戶認證模塊獨立于日志模塊&#xff09;??接口隔離原則…

銳捷交換機STP環路日志信息解讀

因公司網絡組建使用銳捷全系列交換機&#xff0c;近期設備巡檢時發現部分日志提示信息&#xff0c; 接入交換機NBS3100-24GT4SFP-V2&#xff0c;設備頻繁打出STP Blocking的日志信息。 誤以為是環路導致&#xff0c;故進行實驗測試&#xff0c;來驗證環路情況下會如何報日志。…

使用Python調用DeepSeek的示例

使用Python調用DeepSeek API的示例代碼,包括API密鑰的獲取、基本請求的發送以及響應處理。請確保你已經注冊了DeepSeek賬號并獲取了API密鑰。 文章目錄 前言一、獲取API密鑰二、python示例代碼三、代碼說明四、注意事項五、擴展功能總結前言 提示:這里可以添加本文要記錄的大…

mysql的not exists走索引嗎

在MySQL中&#xff0c;?NOT EXISTS子句是否使用索引取決于子查詢中關聯字段是否建立了合適的索引。以下是關鍵點總結&#xff1a; ?索引的作用?&#xff1a; 當子查詢的關聯字段&#xff08;例如B.a_id&#xff09;存在索引&#xff08;如普通B-tree索引&#xff09;時&…

Python線性回歸:從理論到實踐的完整指南

Python線性回歸&#xff1a;從理論到實踐的完整指南 線性回歸是數據科學和機器學習中最基礎且最重要的算法之一。本文將深入探討如何使用Python實現線性回歸&#xff0c;從理論基礎到實際應用&#xff0c;幫助讀者全面理解這一重要的統計學和機器學習方法。 什么是線性回歸&a…