SystemTap使用技巧【三】
阿新 • • 發佈:2019-01-01
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一下就可以。
參考: