【问题标题】:Printing arguments to a kernel function in dtrace在 dtrace 中将参数打印到内核函数
【发布时间】:2018-02-28 06:04:10
【问题描述】:

我需要调试我的 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 用于 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

【问题讨论】:

标签: network-programming solaris dtrace systemtap


【解决方案1】:

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)
    

我添加了指向我打开的关于 DTrace/SystemTap 的书籍的链接,您可以在其中找到更多信息

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2015-06-07
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多