使用 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 和先佔 有助於確認駕駛人可能會中斷會議或先佔 關閉這項功能的時間太長

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

在這個問題中,請使用 Pixel XL 拍攝 HDR+ 相片, 旋轉觀景窗每次都會造成卡頓。我們運用函式分析器 在一小時內解決問題。如要搭配範例 下載追蹤記錄的 ZIP 檔案 (請一併下載 包含本節提及的其他追蹤記錄)、將檔案解壓縮,然後開啟 trace_30898724.html 檔案。

追蹤記錄顯示,在 「ion_client_destroy」不中斷的睡眠。價格高昂 函數,但呼叫頻率不高,因為 ion 用戶端應該 其中涉及許多配置。一開始,問題發生在 Hexagon 程式碼 Halide 確實是問題所在 (因為她為每個人建立了新的用戶端) 資源釋出時,便會銷毀用戶端, 但成本太高)。為所有 Hexagon 改用單一離子用戶端 配置改善了狀況,但卡頓並未修正。

此時,我們需要知道是誰來電,ion_client_destroy 這時就要使用函式分析器:

  1. 由於函式有時會由編譯器重新命名,因此請確認 「ion_client_destroy」在使用以下條件時:
    cat /sys/kernel/tracing/available_filter_functions | grep ion_client_destroy
    
  2. 確認找到項目後,將其當做 ftrace 篩選器使用:
    echo ion_client_destroy > /sys/kernel/tracing/set_ftrace_filter
    
  3. 開啟函式分析器:
    echo function > /sys/kernel/tracing/current_tracer
    
  4. 在每次呼叫篩選器函式時開啟堆疊追蹤:
    echo func_stack_trace > /sys/kernel/tracing/trace_options
    
  5. 增加緩衝區空間:
    echo 64000 > /sys/kernel/tracing/buffer_size_kb
    
  6. 開啟追蹤功能:
    echo 1 > /sys/kernel/tracing/trace_on
    
  7. 執行測試並取得追蹤記錄:
    cat /sys/kernel/tracing/trace > /data/local/tmp/trace
    
  8. 查看追蹤記錄,查看大量和許多堆疊追蹤:
        cameraserver-643   [003] ...1    94.192991: ion_client_destroy <-ion_release
        cameraserver-643   [003] ...1    94.192997: <stack trace>
     => ftrace_ops_no_ops
     => ftrace_graph_call
     => ion_client_destroy
     => ion_release
     => __fput
     => ____fput
     => task_work_run
     => do_notify_resume
     => work_pending
     

根據離子驅動器的檢查結果 使用者空間函式關閉後,ion_client_destroy 被發送垃圾資訊 Fd 到 /dev/ion,而不是隨機核心驅動程式。搜尋 針對 \"/dev/ion\" 的 Android 程式碼集,我們發現多個供應商驅動程式 和 Hexagon 駕駛員一樣,開啟/關閉 /dev/ion (建立及刪除新的 ion 用戶端) 時 則需要新的離子分配請變更為 使用 已在程序生命週期內修正錯誤。


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

使用 Lockstat

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

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

在這個問題中,當所有核心達到上限時,SCHED_FIFO 執行緒就會停滯 會以非 SCHED_FIFO 執行緒載入。我們有一項追蹤記錄顯示大幅鎖定 在 VR 應用程式中,對 Fd 的爭用情況進行質疑,但我們無法輕易判斷該 FD 目前使用的 FD。 如要連同範例操作,請下載 ZIP 檔案 追蹤記錄檔案,其中也包含上述提及的其他追蹤 區段),解壓縮檔案,然後在瀏覽器中開啟 trace_30905547.html 檔案。

我們假設 Ftrace 本身是鎖定爭用來源 低優先順序的執行緒會開始寫入 ftrace 管道,然後 才會釋放鎖定。這是最糟糕的情況 導致混合非常低優先順序的執行緒寫入 Ftrace 標記,以及一些優先順序較高的執行緒,在 CPU 上旋轉至 模擬完全載入的裝置

我們無法使用 ftrace 偵錯,因此 LOCK_STAT 運作正常 然後關閉應用程式中所有其他追蹤。結果顯示鎖頭圖示 爭用是來自 Ftrace 的結果,因為其他爭用情況 執行 ftrace 時鎖定追蹤記錄。


如果您可以使用設定選項啟動核心,鎖定追蹤功能就類似於 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 開放原始碼計畫