在dtrace中打印内核函数的参数

时间:2017-09-19 12:38:43

标签: network-programming solaris dtrace systemtap

我需要调试我的Solaris内核模块,特别是在通过引用我的内核函数传递的结构中提取数据。

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 for solaris模块执行此操作。

我试着查看系统并尝试了一些命令,但这就是我所知道的dtrace:

[root@vcssx247-ldm7 ~]#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

1 个答案:

答案 0 :(得分: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不支持DWARF作为参数名称(它包含arg0 .. arg9变量,其中包含uintptr_t参数的值):

    @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)
    
  4. 我已经添加了关于DTrace / SystemTap的开放式书籍的链接,您可以在其中找到更多信息