使用dtrace跟蹤oracle函式呼叫

westzq1984發表於2013-03-06
以前用gdb跟蹤過oracle的一些函式呼叫,今天找了本dtrace的書看了看。
dtrace比gdb的能力強大多了,而且簡單了很多。
語法基本是 awk + C,做了3個例子,繼續研究

gdb的例子請看:
Tracing Oracle Internal Calls
http://space.itpub.net/?uid-8242091-action-viewspace-itemid-676943

****************************************************************
1.跟蹤邏輯讀取的塊。
****************************************************************
#!/usr/sbin/dtrace -s
#pragma D option quiet

struct arg {
  int32_t arg0;
  int32_t arg1;
  int32_t arg2;
  int32_t arg3;
};

struct arg *arg;

pid$1::kkspsc0:entry{
  i=0;  
}

pid$1::kcbgtcr:entry{
  i++;
  arg=(struct arg *)copyin(arg0,sizeof(arg));
  printf("%5d %s:%s:%s:%s 0x%08x[%d,%d]\n",i,probeprov,probemod,probefunc,probename, arg->arg1,arg->arg1>>22,arg->arg1&0x3fffff);
}

bash-3.2# ./aaa.d 2068
    1 pid2068:oracle:kcbgtcr:entry 0x010000aa[4,170]
    2 pid2068:oracle:kcbgtcr:entry 0x010000aa[4,170]
    3 pid2068:oracle:kcbgtcr:entry 0x010000ab[4,171]
    4 pid2068:oracle:kcbgtcr:entry 0x010000ac[4,172]
    5 pid2068:oracle:kcbgtcr:entry 0x010000ad[4,173]
    6 pid2068:oracle:kcbgtcr:entry 0x010000ae[4,174]
    7 pid2068:oracle:kcbgtcr:entry 0x010000af[4,175]
    8 pid2068:oracle:kcbgtcr:entry 0x010000b0[4,176]
    9 pid2068:oracle:kcbgtcr:entry 0x010000b1[4,177]
   10 pid2068:oracle:kcbgtcr:entry 0x010000b2[4,178]
   11 pid2068:oracle:kcbgtcr:entry 0x010000b3[4,179]
   12 pid2068:oracle:kcbgtcr:entry 0x010000b4[4,180]
   13 pid2068:oracle:kcbgtcr:entry 0x010000b5[4,181]
   14 pid2068:oracle:kcbgtcr:entry 0x010000b6[4,182]
   15 pid2068:oracle:kcbgtcr:entry 0x010000b7[4,183]
   16 pid2068:oracle:kcbgtcr:entry 0x010000b9[4,185]
   17 pid2068:oracle:kcbgtcr:entry 0x010000ba[4,186]
   18 pid2068:oracle:kcbgtcr:entry 0x010000bb[4,187]
   19 pid2068:oracle:kcbgtcr:entry 0x010000bc[4,188]
   20 pid2068:oracle:kcbgtcr:entry 0x010000bd[4,189]
   21 pid2068:oracle:kcbgtcr:entry 0x010000be[4,190]
   22 pid2068:oracle:kcbgtcr:entry 0x010000bf[4,191]
   23 pid2068:oracle:kcbgtcr:entry 0x010000c0[4,192]
   24 pid2068:oracle:kcbgtcr:entry 0x010000c1[4,193]
   25 pid2068:oracle:kcbgtcr:entry 0x010000c2[4,194]
   26 pid2068:oracle:kcbgtcr:entry 0x010000c3[4,195]
   27 pid2068:oracle:kcbgtcr:entry 0x010000c4[4,196]
   28 pid2068:oracle:kcbgtcr:entry 0x010000c5[4,197]

****************************************************************
2.跟蹤latch的獲取和釋放
****************************************************************
SELECT LOWER(addr)||','||NAME||','||'C'||child#||','||latch#||','||level# FROM v$latch_children
UNION ALL
SELECT LOWER(addr)||','||NAME||','||'P'||','||latch#||','||level# FROM v$latch

#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option destructive

pid$1::kslgetl:entry,pid$1::kslfre:entry{
  printf("%s:%s:%s:%s\t", probeprov,probemod,probefunc,probename);
  system("grep %x latchlist.txt",arg0);
}

bash-3.2# ./aaa.d 2068
pid2068:oracle:kslfre:entry     000000009e4a3748,session idle bit,C2,14,1
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     000000009e4a3748,session idle bit,C2,14,1
pid2068:oracle:kslfre:entry     000000009e4a3748,session idle bit,C2,14,1
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslgetl:entry    00000000601069d8,shared pool,C1,307,7
pid2068:oracle:kslfre:entry     00000000601069d8,shared pool,C1,307,7


****************************************************************
3.函式呼叫棧
****************************************************************
#!/usr/sbin/dtrace -s
#pragma D option quiet

pid$1::*:entry{
  printf("%s.%s.%s", probemod,probefunc,probename);
  ustack();
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-755399/,如需轉載,請註明出處,否則將追究法律責任。

相關文章