1. 程式人生 > >SystemTap使用技巧【三】

SystemTap使用技巧【三】

1、檢視程式碼執行路徑

     在分析程式碼的時候,能清晰地觀察程式碼執行路徑對Debug效率很有幫助,比如,最近在分析核心tcp回覆ack的程式碼執行路徑的時候就用到這個技巧,看看下面是tcp回覆ack的程式碼:
     我想看看程式碼執行到if分支裡面還是else分支裡面,一種辦法是分析if的條件是否為真,簡單點的條件還好,就上面這段程式碼要分析if裡面的條件肯定很費勁吧,另一種辦法就是這裡要講的技巧,就是用systemtap的函式pp(),這個函式能得到當前的探測點,我們只要設定一個*的statement探測點然後把pp()結果打印出來就可以了,程式碼如下:
[email protected]
~/systemtap# cat tcp_ack_snd_check.stp probe begin { printf("begin\n"); } probe kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:*") { printf("%s\n", pp()); }
     執行之後結果如下:
[email protected] ~/systemtap# stap tcp_ack_snd_check.stp 
begin
kernel.statement("
[email protected]
/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4807") kernel.statement("[email protected]
/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4812") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4803") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4805") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4810") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4803") kernel.statement("[email protected]/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4810")
     看看上面的結果每行最後都把行號打印出來了,再對照一下程式碼就可以清晰看到程式碼的執行路徑,很爽吧。。。

2、除錯核心模組

     這小節就不細講了,最後的參考網址這篇部落格寫得很詳細,這裡只copy兩個關鍵點過來記錄一下:      要除錯自己的核心模組,要注意的有兩個關鍵點:     1)、使用SystemTap除錯核心模組,探測點的編寫格式示例為:
           module("ext3").function("ext3_*")
    2)、需要將自己的模組cp到/lib/modules/`uname -r`/extra目錄中,否則找不到符號,如果/lib/modules/`uname -r`/目錄下沒有extra這個目錄,自己mkdir一下就可以。
參考: