我需要调试我的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
答案 0 :(得分:0)
DTrace在概念上与SystemTap类似(实际上,反之亦然,SystemTap后来出现):
与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
访问arguments是完全不同的,因为DTrace不支持DWARF作为参数名称(它包含arg0
.. arg9
变量,其中包含uintptr_t
参数的值):
@cast($skpb, "struct sk_buff", "mod") -> ((struct sk_buff*) arg0)
访问内核数据类似,但printing函数不同:
print($skpb->sk_field) -> trace(args[0]->sk_field)
print("%32m", $src) -> tracemem(arg2, 32)
我已经添加了关于DTrace / SystemTap的开放式书籍的链接,您可以在其中找到更多信息