Network programming 在dtrace中将参数打印到内核函数

Network programming 在dtrace中将参数打印到内核函数,network-programming,solaris,dtrace,systemtap,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脚本来访问参数和提取数据 如何使用针对solaris模块的DTRACE实现这一点 我试着

我需要调试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脚本来访问参数和提取数据

如何使用针对solaris模块的DTRACE实现这一点

我试着查看系统并尝试了一些命令,但这就是我对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

DTrace在概念上类似于SystemTap(实际上,随着SystemTap的出现,反之亦然):

  • 与SystemTap一样,它可以附加到函数,但需要不同的语法:

    kernel.function("xxx")                 ->    fbt:genunix:xxx:return
    module("mod").function("xxx")          ->    fbt:mod:xxx:entry
    module("mod").function("xxx").return   ->    fbt:mod:xxx:return
    
  • 由于DTrace不支持DWARF作为参数名(它有
    arg0
    arg9
    变量,其中包含
    uintptr\t
    参数值),因此访问是完全不同的:

  • 访问内核数据类似,但函数不同:

    print($skpb->sk_field)                 ->    trace(args[0]->sk_field)
    print("%32m", $src)                    ->    tracemem(arg2, 32)
    
  • 我已经添加了关于DTrace/SystemTap的公开书籍的链接,您可以在其中找到更多信息

    这可能与以下内容有关:
    print($skpb->sk_field)                 ->    trace(args[0]->sk_field)
    print("%32m", $src)                    ->    tracemem(arg2, 32)