SystemTap使用技巧【三】

1、查看代碼執行路徑

     在分析代碼的時候,能清晰地觀察代碼執行路徑對Debug效率很有幫助,比如,最近在分析內核tcp回覆ack的代碼執行路徑的時候就用到這個技巧,看看下面是tcp回覆ack的代碼:

     我想看看代碼執行到if分支裏面還是else分支裏面,一種辦法是分析if的條件是否爲真,簡單點的條件還好,就上面這段代碼要分析if裏面的條件肯定很費勁吧,另一種辦法就是這裏要講的技巧,就是用systemtap的函數pp(),這個函數能得到當前的探測點,我們只要設置一個*的statement探測點然後把pp()結果打印出來就可以了,代碼如下:
root@jusse ~/systemtap# cat tcp_ack_snd_check.stp 
probe begin
{
    printf("begin\n");
}

probe kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:*")
{
    printf("%s\n", pp());
}
     運行之後結果如下:
root@jusse ~/systemtap# stap tcp_ack_snd_check.stp 
begin
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4807")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4812")

kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4803")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4805")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4810")

kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4793")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4797")
kernel.statement("__tcp_ack_snd_check@/build/buildd/linux-lts-trusty-3.13.0/net/ipv4/tcp_input.c:4803")
kernel.statement("__tcp_ack_snd_check@/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一下就可以。

參考:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章