以前用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();
}