2017-09-19 88 views
2

我需要調試我的Solaris內核模塊,特別是抽取引用傳遞給我的內核函數的結構中的數據。將參數打印到dtrace中的內核函數

msg_recv(sk_buff *skbp, uint_t link, uchar_t* src) 
{ 
    pkt_hdr_t *pkt; 
    pkt = (pkt_hdr_t *)skbp->data; 
    port = pkt->port;  
} 

我在linux中編寫了一個systemtap腳本來訪問參數和提取數據。

如何使用DTRACE爲solaris模塊執行此操作。

我試圖尋找到系統中,並試圖幾個命令,但多數民衆贊成我所知道的有關DTrace:

[[email protected] ~]#dtrace -l | grep msg_recv 
7090  fbt    mymod      msg_recv1 entry 
7091  fbt    mymod      msg_recv1 return 
7548  fbt    mymod      msg_recv entry 
7549  fbt    mymod      msg_recv return 
+0

這可能是相關的:http://dtrace.org/guide/chp-structs.html –

回答

0

DTrace是概念上類似於SystemTap的(實際上,反之亦然SystemTap的後來):

  1. 的SystemTap一樣,它可以連接probes的功能,但它需要不同的語法:

    kernel.function("xxx")     -> fbt:genunix:xxx:return 
    module("mod").function("xxx")   -> fbt:mod:xxx:entry 
    module("mod").function("xxx").return -> fbt:mod:xxx:return 
    
  2. 訪問arguments是相當不同,因爲DTrace的不支持的參數名稱(它有arg0 .. arg9變量包含的參數uintptr_t值)DWARF:

    @cast($skpb, "struct sk_buff", "mod") -> ((struct sk_buff*) arg0) 
    
  3. 訪問內核中的數據,類似但printing功能是不同的:

    print($skpb->sk_field)     -> trace(args[0]->sk_field) 
    print("%32m", $src)     -> tracemem(arg2, 32) 
    

我已經添加了鏈接到我的Ø關於DTrace/SystemTap的筆書,您可以在其中找到更多信息