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:
- 將緩衝區空間設為足以擷取追蹤記錄的值:
echo 96000 > /sys/kernel/tracing/buffer_size_kb
- 啟用追蹤:
echo 1 > /sys/kernel/tracing/tracing_on
- 執行測試,然後停用追蹤功能:
echo 0 > /sys/kernel/tracing/tracing_on
- 傾印追蹤記錄:
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 事件:
- 開啟原始 ftrace 記錄。以下是新版 Systrace 中的追蹤記錄
預設會壓縮:
- 如果你使用
--no-compress
擷取 Systrace,這裡 「BEGIN TRACE」開頭的 html 檔案。 - 如果沒有,請執行
Catapult
樹狀結構 (
tracing/bin/html2trace
),解壓縮追蹤記錄。
- 如果你使用
- 在 Catapult 視覺化內容中找出相對時間戳記,
- 在此追蹤記錄的開頭處尋找一行內容,內含以下程式碼:
tracing_mark_sync
。如下所示: 敬上<5134>-5134 (-----) [003] ...1 68.104349: tracing_mark_write: trace_event_clock_sync: parent_ts=68.104286
如果這一行不存在 (或者您使用了沒有追蹤記錄的 ftrace),則 顯示時間取決於 ftrace 記錄檔中的第一個事件。- 將相對時間戳記 (以毫秒為單位) 加入
parent_ts
(以秒為單位)。 - 搜尋新的時間戳記。
- 將相對時間戳記 (以毫秒為單位) 加入
這些步驟應讓您已能達到 (或至少接近) 事件。
使用動態 ftrace
當 systrace 和標準 ftrace 不足時, 相關課程:動態 ftrace。動態追蹤記錄包括重新編寫 核心程式碼,因此無法在正式環境中使用 與核心的結構有關不過, 2015 年和 2016 年最終使用了動態 Ftrace 造成的根本原因。尤其是 可以對不可中斷的睡眠進行偵錯,因為你可以取得堆疊追蹤 您每次觸發函式時都會觸發不可中斷的睡眠。 您也可以對已停用乾擾和先佔設定的區段進行偵錯,這 有助於證明問題
如要啟用動態 ftrace,請編輯核心的定義:
- 移除 CONFIG_STRICT_MEMORY_RWX (如果有的話)。如果您使用 3.18 版或 新版 arm64 並不需要
- 新增下列指令:CONFIG_DYNAMIC_FTRACE=y, CONFIG_FUNCTION_TRACER=y, CONFIG_IRQSOFF_TRACER=y、CONFIG_FUNCTION_PROFILER=y 和 CONFIG_PREEMPT_TRACER=y
- 重新建構並啟動新核心。
- 執行下列指令,檢查可用的追蹤器:
cat /sys/kernel/tracing/available_tracers
- 確認指令傳回
function
、irqsoff
。preemptoff
和preemptirqsoff
。 - 請執行下列指令,確保動態 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:
- 啟用追蹤:
echo 1 > /proc/sys/kernel/lock_stat
- 執行測試。
- 停用追蹤:
echo 0 > /proc/sys/kernel/lock_stat
- 傾印追蹤記錄:
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() 產生 (狀態狀態);