2013-03-07 87 views
12

我想在內核啓動過程中使用ftrace function_graph來跟蹤函數以瞭解它的功能,但在available_filter_functions中不可用。如何使一個linux內核函數可用於ftrace function_graph tracer?

我試圖用EXPORT_SYMBOL()導出它,猜測它會使它可用,但事實並非如此。

您有解決方案嗎?

有關信息,我想跟蹤的功能是Android內核3.4中的persistent_ram_init_ringbufferpersistent_ram_early_init

我通過文檔閱讀,但什麼也沒發現這個和grep沒有幫助更多...

感謝

+0

從我對Ftrace的理解中,函數的動態追蹤依賴於每個內核函數開始時的mcount函數調用。如果您感興趣的功能沒有可用的過濾器可能不會顯示。你有沒有考慮過不使用動態跟蹤?它可能會產生更好的結果。 – 2013-03-11 20:32:56

+1

EXPORT_SYMBOL似乎與解決GPL /非GPL許可問題的內核模塊加載器有關,而不是Ftrace。 – bazza 2013-03-15 07:45:35

+1

當你列出available_filter_functions什麼都得到列出?從編譯內核的CONFIG_FUNCTION_TRACER(和所有其他ftrace gubbins)開啓內核函數入口/出口跟蹤時,我可以看出,通過設置gcc命令行上的選項來實現。這些選項使gcc爲編譯的每個函數發出一個特定的函數調用。如果我理解了正確的話,這意味着任何linux內核函數都應該被ftrace自動捕獲。這導致我想知道你的內核中是否有任何東西可以追蹤。 – bazza 2013-03-15 07:52:07

回答

8

問題是這些函數是用__init和__devinit註釋的,它們是由ftrace函數跟蹤程序列出的黑名單。

爲什麼?因爲作爲模塊初始化函數(或內核初始化函數),它們在初始化過程中加載並在初始化完成時刪除。每個跟蹤軌跡的函數都保存在一個特殊的緊湊表中。目前,沒有辦法告訴ftrace這些函數已經被刪除(釋放),並且ftrace應該從它的表中刪除它們。如果我們忽略這一點,那麼當啓用函數跟蹤時,ftrace會嘗試修改不再存在的位置並導致各種問題(請記住e1000e錯誤?)。

如果您確實想跟蹤它們,請刪除這些註釋。然後它們應該出現在要跟蹤的函數列表中。

+0

謝謝你的回答。我知道'notrace',但不是'__init'和'__devinit'的範圍。 – 2013-05-27 12:22:47

+1

哇....很高興在這裏見到你Steven Rostedt。您絕對是linux內核中ftrace API的原始作者之一。 – 2014-08-02 13:13:10

+0

即使它顯然不包含__init或__devinit標誌,我也無法跟蹤* sched_wakeup *。 – Claudio 2015-12-21 09:41:43

相關問題