2017-09-19 52 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的笔书,您可以在其中找到更多信息