使用 ftrace

ftrace 是偵錯工具 Linux kernel。以下各節將詳細說明基本 ftrace 功能、ftrace 會用於擷取核心事件和動態 ftrace。

如要進一步瞭解無法使用的進階 ftrace 功能 請參閱 Systrace 的 ftrace 說明文件 <kernel tree>/Documentation/trace/ftrace.txt

透過追蹤記錄擷取核心事件

atrace (frameworks/native/cmds/atrace) 使用 ftrace 擷取 核心事件。而 systrace.py (在後續版本的 Catapult) 使用 ADB 要在裝置上執行追蹤記錄atrace 會執行以下操作:

  • 設定屬性來設定使用者模式追蹤 (debug.atrace.tags.enableflags)。
  • 透過寫入適當的 Ftrace 功能啟用所需的 ftrace 功能 ftrace sysfs 節點。但由於 ftrace 支援更多功能,因此您可以 有些 sysfs 節點則自行使用 atrace

請使用追蹤記錄來設定 更新為適當的值。房源為位元遮罩,沒有任何商品 不以查看適當標題的方式來判斷正確的值 這可能會發生在 Android 版本之間出現的差異。

啟用 ftrace 事件

ftrace sysfs 節點位於 /sys/kernel/tracing,且追蹤記錄中 事件會分為 /sys/kernel/tracing/events 類別。

如要分別為每個類別啟用事件,請使用:

echo 1 > /sys/kernel/tracing/events/irq/enable

如要為個別事件啟用事件,請使用:

echo 1 > /sys/kernel/tracing/events/sched/sched_wakeup/enable

如果透過寫入 sysfs 節點的方式啟用額外事件,這些事件 不會透過追蹤記錄重設。常見模式 Qualcomm 裝置啟用程序必須為啟用 kgsl (GPU) 和 mdss (顯示管道) 追蹤點,然後使用追蹤記錄或 systrace

adb shell "echo 1 > /sys/kernel/tracing/events/mdss/enable"
adb shell "echo 1 > /sys/kernel/tracing/events/kgsl/enable"
./systrace.py sched freq idle am wm gfx view binder_driver irq workq ss sync -t 10 -b 96000 -o full_trace.html

您也可以在不使用 atrace 或 systrace 的情況下使用 ftrace 當您想取得僅限核心的追蹤記錄 (或如果您花了時間寫入) 使用者模式追蹤屬性)。如果只要執行 ftrace:

  1. 將緩衝區空間設為足以擷取追蹤記錄的值:
    echo 96000 > /sys/kernel/tracing/buffer_size_kb
    
  2. 啟用追蹤:
    echo 1 > /sys/kernel/tracing/tracing_on
    
  3. 執行測試,然後停用追蹤功能:
    echo 0 > /sys/kernel/tracing/tracing_on
    
  4. 傾印追蹤記錄:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace_output
    

trace_output 會以文字形式提供追蹤記錄。如何使用 投石機,取得 Catapult GitHub 存放區並執行 trace2html:

catapult/tracing/bin/trace2html ~/path/to/trace_file

根據預設,這在相同的寫入要求中寫入 trace_file.html 目錄。

建立事件的關聯性

查看 Catapult 視覺化呈現和 Ftrace 經常會很實用 同時記錄例如一些 ftrace 事件 (尤其是特定供應商 不是以 Catapult 呈現的影像。不過,Catapult 的時間戳記是 相對於追蹤記錄中的第一個事件或特定時間戳記 而原始 ftrace 時間戳記則依據特定記錄 Linux 核心中的絕對時鐘來源。

如何找出 Catapult 事件中的特定 ftrace 事件:

  1. 開啟原始 ftrace 記錄。以下是新版 Systrace 中的追蹤記錄 預設會壓縮:
    • 如果你使用 --no-compress 擷取 Systrace,這裡 「BEGIN TRACE」開頭的 html 檔案。
    • 如果沒有,請執行 Catapult 樹狀結構 (tracing/bin/html2trace),解壓縮追蹤記錄。
  2. 在 Catapult 視覺化內容中找出相對時間戳記,
  3. 在此追蹤記錄的開頭處尋找一行內容,內含以下程式碼: tracing_mark_sync。如下所示:
    <5134>-5134  (-----) [003] ...1    68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
    
    敬上
    如果這一行不存在 (或者您使用了沒有追蹤記錄的 ftrace),則 顯示時間取決於 ftrace 記錄檔中的第一個事件。
    1. 將相對時間戳記 (以毫秒為單位) 加入 parent_ts (以秒為單位)。
    2. 搜尋新的時間戳記。

這些步驟應讓您已能達到 (或至少接近) 事件。

使用動態 ftrace

當 systrace 和標準 ftrace 不足時, 相關課程:動態 ftrace。動態追蹤記錄包括重新編寫 核心程式碼,因此無法在正式環境中使用 與核心的結構有關不過, 2015 年和 2016 年最終使用了動態 Ftrace 造成的根本原因。尤其是 可以對不可中斷的睡眠進行偵錯,因為你可以取得堆疊追蹤 您每次觸發函式時都會觸發不可中斷的睡眠。 您也可以對已停用乾擾和先佔設定的區段進行偵錯,這 有助於證明問題

如要啟用動態 ftrace,請編輯核心的定義:

  1. 移除 CONFIG_STRICT_MEMORY_RWX (如果有的話)。如果您使用 3.18 版或 新版 arm64 並不需要
  2. 新增下列指令:CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y、CONFIG_FUNCTION_PROFILER=y 和 CONFIG_PREEMPT_TRACER=y
  3. 重新建構並啟動新核心。
  4. 執行下列指令,檢查可用的追蹤器:
    cat /sys/kernel/tracing/available_tracers
    
  5. 確認指令傳回 functionirqsoffpreemptoffpreemptirqsoff
  6. 請執行下列指令,確保動態 ftrace 正常運作:
    cat /sys/kernel/tracing/available_filter_functions | grep <a function you care about>
    

完成上述步驟後,您就能使用動態 ftrace、函式分析器 irqsoff 分析器和可用的先佔分析器我們強烈 建議參閱這些主題的 ftrace 說明文件,再使用 因為功能強大但複雜而複雜irqsoff 和先佔 有助於確認駕駛人可能會中斷會議或先佔 關閉這項功能的時間太長

函式分析器是效能問題的最佳選擇,這類分析器經常 來判定函式呼叫的位置。


如果函式分析器的資料不夠具體,您可以結合 支援函式分析器的 ftrace 追蹤點。您必須在以下位置啟用 ftrace 事件: 和平常一樣,並且會在您的追蹤記錄中交錯使用。 如果特定服務中偶爾有長時間不中斷的睡眠,這項功能就非常實用 :將 ftrace 篩選器設為所需函式, 啟用追蹤點、擷取追蹤記錄。您可以使用下列條件剖析產生的追蹤記錄 trace2html,找到所需事件,然後取得附近的堆疊追蹤 在原始追蹤記錄中列出

使用 Lockstat

有時候,ftrace 可能不足,而您實際上需要針對 因為核心鎖定爭用情形還有一個核心選項值得嘗試: CONFIG_LOCK_STAT。這個替代方案非常不得已 會加載 超越大多數裝置所能處理的核心。

不過,Lockstat 會使用偵錯 對許多其他應用程式來說 這都很實用適合所有人 執行裝置引導作業應設法找出方法讓這類功能正常運作 因為您認為這個階段 「如果只有我能開啟 LOCK_STAT,我可以確認或拒絕這個情況 從 5 天縮短到 5 天就造成問題。」


如果您可以使用設定選項啟動核心,鎖定追蹤功能就類似於 ftrace:

  1. 啟用追蹤:
    echo 1 > /proc/sys/kernel/lock_stat
    
  2. 執行測試。
  3. 停用追蹤:
    echo 0 > /proc/sys/kernel/lock_stat
    
  4. 傾印追蹤記錄:
    cat /proc/lock_stat > /data/local/tmp/lock_stat
    

如要瞭解如何解讀結果,請參閱 Lockstat 說明文件 通知時間:<kernel>/Documentation/locking/lockstat.txt

使用供應商追蹤點

先使用上游追蹤點,但有時候您需要使用廠商追蹤點:

  { "gfx",        "Graphics",         ATRACE_TAG_GRAPHICS, {
        { OPT,      "events/mdss/enable" },
        { OPT,      "events/sde/enable" },
        { OPT,      "events/mali_systrace/enable" },
    } },

追蹤點可透過 HAL 服務擴充,可讓您新增裝置專屬的追蹤記錄 點數/類別。追蹤點已整合 Perfetto、atrace/systrace 以及裝置端系統 追蹤應用程式

用於實作追蹤點/類別的 API 如下:

  • listCategory() 會產生 (vec<TracingCategory>類別)
  • enableCategory(vec<string>類別) 產生 (狀態狀態);
  • stopAllCategory() 產生 (狀態狀態);
,瞭解如何調查及移除這項存取權。 如要進一步瞭解,請參閱 Android 開放原始碼計畫