2017-09-19 9 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를 사용하여 어떻게 수행 할 수 있습니까?

내가 시스템에보고 몇 가지 명령을 시도했지만, 내가 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. 을 DTrace를가 인수 이름 (이 인수 uintptr_t 값이 포함되어 arg0 .. arg9 변수가)에 대한 DWARF를 지원하지 않는 arguments 액세스
  3. 는 매우 다르다 :

    @cast($skpb, "struct sk_buff", "mod") -> ((struct sk_buff*) arg0) 
    
  4. 가에서 커널 데이터 액세스를 유사하다 하지만 printing 기능이 다릅니다 :

    print($skpb->sk_field)     -> trace(args[0]->sk_field) 
    print("%32m", $src)     -> tracemem(arg2, 32) 
    

나는 내 오에 대한 링크를 추가했습니다 더 많은 정보를 얻을 수있는 DTrace/SystemTap에 대한 펜 북