[20260707]验证跟踪library cache lock library cache pin使用bpftrace的脚本是否执行正确.txt
--//跟踪[library cache lock library cache pin使用bpftrace的脚本增加获得library cache lock address以及library cache pin
--//address,不知道是否正确,通过例子验证看看。
1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试脚本:
create procedure lcp
is
begin
sys.dbms_lock.sleep(3600);
end;
/
3.测试:
--//session 1:
SCOTT@book01p( 119,35876,@1 spid=3228 )> exec lcp
--//session 2:
SCOTT@book01p( 218,25361,@1 spid=3299 )> alter procedure lcp compile;
--//挂起!!
--//session 3:
SCOTT@book01p( 207,39071,@1 spid=3446 )>
--//在执行前window 1执行:
# bpftrace /home/oracle/study/202606/lkpn21z.bt 3446
Attached 5 probes
Tracing Oracle kgllkal/kglpnal... Target PID: 3446
Hit Ctrl-C to stop.
--//session 3:
SCOTT@book01p( 207,39071,@1 spid=3446 )> alter procedure lcp compile;
--//挂起!!
--//这样会出现library cache pin ,library cache lock等待事件.
SYS@book> @ ashtop sid,BLOCKING_SESSION,event,p1raw,p2raw,p3raw 1=1 &30s
Total Distinct Distinct Distinct
Seconds AAS %This SID BLOCKING_SESSION EVENT P1RAW P2RAW P3RAW FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1
--------- ------- ------- ---------- ---------------- ------------------ ----------------- ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
30 1.0 45% | 207 218 library cache lock 0000000069A3BF40 0000000066FDF628 000129ED00010003 2026-07-07 15:19:15 2026-07-07 15:19:44 1 30 1
30 1.0 45% | 218 119 library cache pin 0000000069A3BF40 000000006922B598 000129ED00010003 2026-07-07 15:19:15 2026-07-07 15:19:44 1 30 1
4 .1 6% | 5 2026-07-07 15:19:16 2026-07-07 15:19:44 1 4 4
2 .1 3% | 216 2026-07-07 15:19:31 2026-07-07 15:19:36 1 2 2
book> @ ev_namezpr '^library cache lock$'
==============================
EVENT# : 376
EVENT_ID : 916468430
NAME : library cache lock
PARAMETER1 : handle address
PARAMETER2 : lock address
PARAMETER3 : 100*mode+namespace
WAIT_CLASS_ID : 3875070507
WAIT_CLASS# : 4
WAIT_CLASS : Concurrency
DISPLAY_NAME : library cache lock
CON_ID : 0
PL/SQL procedure successfully completed.
SYS@book> @ ev_namezpr '^library cache pin$'
==============================
EVENT# : 375
EVENT_ID : 2802704141
NAME : library cache pin
PARAMETER1 : handle address
PARAMETER2 : pin address
PARAMETER3 : 100*mode+namespace
WAIT_CLASS_ID : 3875070507
WAIT_CLASS# : 4
WAIT_CLASS : Concurrency
DISPLAY_NAME : library cache pin
CON_ID : 0
PL/SQL procedure successfully completed.
--//P2 对应的就是 lock address 或者 pin address 地址。
--//sid=207 阻塞 sid=218,出现library cache lock等待事件,而sid=218阻塞sid=119 出现library cache pin等待事件.
--//session 1:
SCOTT@book01p( 119,35876,@1 spid=3228 )> exec lcp
BEGIN lcp; END;
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
ORA-06512: at "SYS.DBMS_LOCK", line 215
ORA-06512: at "SCOTT.LCP", line 4
ORA-06512: at line 1
--//window 1:
# bpftrace /home/oracle/study/202606/lkpn21z.bt 3446
Attached 5 probes
Tracing Oracle kgllkal/kglpnal... Target PID: 3446
Hit Ctrl-C to stop.
[15:15:51] kgllkal #01 pid=3446 handle=0000000066fc9b40 mode=1 obj=alter procedure lcp compile
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fe0908
[15:15:51] kgllkal #02 pid=3446 handle=0000000066a15f58 mode=1 obj=
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdf020
[15:15:51] kglpnal #01 pid=3446 handle=0000000066a15f58 mode=3 obj=
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdf628
[15:15:51] kgllkal #03 pid=3446 handle=000000007288c250 mode=2 obj=bookSYSCDB$ROOT
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdec60
[15:15:51] kgllkal #04 pid=3446 handle=000000006ddc26b0 mode=2 obj=1847639831SYSCDB$ROOT
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdeb70
[15:15:51] kgllkal #05 pid=3446 handle=0000000066a14b28 mode=1 obj=e985fc239b919877f25909e8f398a456Child:1BOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdea80
[15:15:51] kglpnal #02 pid=3446 handle=0000000066a14b28 mode=3 obj=e985fc239b919877f25909e8f398a456Child:1BOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fde990
[15:15:51] kgllkal #06 pid=3446 handle=00000000694d0038 mode=1 obj=SCOTTBOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdea80
[15:15:51] kgllkal #07 pid=3446 handle=000000007288c250 mode=2 obj=bookSYSCDB$ROOT
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdf628
[15:15:51] kgllkal #08 pid=3446 handle=000000006ddc26b0 mode=2 obj=1847639831SYSCDB$ROOT
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdec60
[15:15:51] kglpnal #03 pid=3446 handle=000000006b25c0b8 mode=2 obj=DATABASESYSBOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdf628
[15:15:51] kglpnal #04 pid=3446 handle=000000006b25c0b8 mode=2 obj=DATABASESYSBOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdf628
[15:15:51] kgllkal #09 pid=3446 handle=0000000069c06c40 mode=1 obj=LOGMNRGGC_TRIGGERSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdec60
[15:15:51] kglpnal #05 pid=3446 handle=0000000069c06c40 mode=2 obj=LOGMNRGGC_TRIGGERSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdeb70
[15:15:51] kgllkal #10 pid=3446 handle=0000000069bb4d58 mode=1 obj=NO_VM_DDLWMSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdec60
[15:15:51] kglpnal #06 pid=3446 handle=0000000069bb4d58 mode=2 obj=NO_VM_DDLWMSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdeb70
[15:15:51] kgllkal #11 pid=3446 handle=0000000066db3e68 mode=1 obj=LBAC$BEFORE_ALTERLBACSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdec60
[15:15:51] kglpnal #07 pid=3446 handle=0000000066db3e68 mode=2 obj=LBAC$BEFORE_ALTERLBACSYSBOOK01P
[15:15:51] kglGetSO pid=3446 return PIN ADDRESS=0000000066fdeb70
[15:15:51] kgllkal #12 pid=3446 handle=0000000069a3bf40 mode=1 obj=LCPSCOTTBOOK01P
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdf628
[15:15:51] kgllkal #13 pid=3446 handle=0000000069a3bf40 mode=3 obj=LCPSCOTTBOOK01P
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --//对应对象lcp。
[15:15:51] kglGetSO pid=3446 return LOCK ADDRESs=0000000066fdf628
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.......
--//如果这时中断session 1 sid=119的执行,session 2 sid=218可以正常执行,接着session 3也可以正常执行.
--//注意看下划线
--//handle=0000000069a3bf40 mode=3 obj=LCPSCOTTBOOK01P 对应就是lcp存储过程。
--//LOCK ADDRESs=0000000066fdf628 与前面ashtop的输出library cache lock那行的P2raw对应。
4.继续:
--//session 1:
SCOTT@book01p( 119,35876,@1 spid=3228 )> exec lcp
--//session 2:
SCOTT@book01p( 218,25361,@1 spid=3299 )>
--//在执行前window 1执行:
# bpftrace /home/oracle/study/202606/lkpn21z.bt 3299
Attached 5 probes
Tracing Oracle kgllkal/kglpnal... Target PID: 3299
Hit Ctrl-C to stop.
SCOTT@book01p( 218,25361,@1 spid=3299 )> alter procedure lcp compile;
--//挂起!!
# bpftrace /home/oracle/study/202606/lkpn21z.bt 3299
Attached 5 probes
Tracing Oracle kgllkal/kglpnal... Target PID: 3299
Hit Ctrl-C to stop.
[15:40:30] kgllkal #01 pid=3299 handle=0000000066fc9b40 mode=1 obj=alter procedure lcp compile
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000069239120
[15:40:30] kgllkal #02 pid=3299 handle=0000000066bfb488 mode=1 obj=
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=000000006922b8d0
[15:40:30] kglpnal #01 pid=3299 handle=0000000066bfb488 mode=3 obj=
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000066fd0358
[15:40:30] kgllkal #03 pid=3299 handle=000000007288c250 mode=2 obj=bookSYSCDB$ROOT
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kgllkal #04 pid=3299 handle=000000006ddc26b0 mode=2 obj=1847639831SYSCDB$ROOT
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000069239030
[15:40:30] kgllkal #05 pid=3299 handle=0000000066db4398 mode=1 obj=e985fc239b919877f25909e8f398a456Child:0BOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000061ec6b30
[15:40:30] kglpnal #02 pid=3299 handle=0000000066db4398 mode=3 obj=e985fc239b919877f25909e8f398a456Child:0BOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000061f5d290
[15:40:30] kgllkal #06 pid=3299 handle=00000000694d0038 mode=1 obj=SCOTTBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000061ec6b30
[15:40:30] kgllkal #07 pid=3299 handle=000000007288c250 mode=2 obj=bookSYSCDB$ROOT
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0358
[15:40:30] kgllkal #08 pid=3299 handle=000000006ddc26b0 mode=2 obj=1847639831SYSCDB$ROOT
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kglpnal #03 pid=3299 handle=000000006b25c0b8 mode=2 obj=DATABASESYSBOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000066fd0358
[15:40:30] kglpnal #04 pid=3299 handle=000000006b25c0b8 mode=2 obj=DATABASESYSBOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000066fd0358
[15:40:30] kgllkal #09 pid=3299 handle=0000000069c06c40 mode=1 obj=LOGMNRGGC_TRIGGERSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kglpnal #05 pid=3299 handle=0000000069c06c40 mode=2 obj=LOGMNRGGC_TRIGGERSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000061d39150
[15:40:30] kgllkal #10 pid=3299 handle=0000000069bb4d58 mode=1 obj=NO_VM_DDLWMSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kglpnal #06 pid=3299 handle=0000000069bb4d58 mode=2 obj=NO_VM_DDLWMSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000061d39150
[15:40:30] kgllkal #11 pid=3299 handle=0000000066db3e68 mode=1 obj=LBAC$BEFORE_ALTERLBACSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kglpnal #07 pid=3299 handle=0000000066db3e68 mode=2 obj=LBAC$BEFORE_ALTERLBACSYSBOOK01P
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000061d39150
[15:40:30] kgllkal #12 pid=3299 handle=0000000069ae70e0 mode=1 obj=select count(*) from user$ u where bitand(u.spare1, 256) = 256 and u.type# = 1 and u.name = :1
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0358
[15:40:30] kgllkal #13 pid=3299 handle=00000000699d92a0 mode=1 obj=
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000066fd0110
[15:40:30] kgllkal #14 pid=3299 handle=0000000069a3bf40 mode=1 obj=LCPSCOTTBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000061d39150
[15:40:30] kgllkal #15 pid=3299 handle=0000000069a3bf40 mode=3 obj=LCPSCOTTBOOK01P
[15:40:30] kglGetSO pid=3299 return LOCK ADDRESs=0000000061d39150
[15:40:30] kglpnal #08 pid=3299 handle=0000000069a3bf40 mode=3 obj=LCPSCOTTBOOK01P
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[15:40:30] kglGetSO pid=3299 return PIN ADDRESS=0000000061d39060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SYS@book> @ ashtop sid,BLOCKING_SESSION,event,p1raw,p2raw,p3raw 1=1 &30s
Total Distinct Distinct Distinct
Seconds AAS %This SID BLOCKING_SESSION EVENT P1RAW P2RAW P3RAW FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1
--------- ------- ------- ---------- ---------------- ----------------- ----------------- ----------------- ----------------- ------------------- ------------------- ---------- -------- -----------
30 1.0 97% | 218 119 library cache pin 0000000069A3BF40 0000000061D39060 000129ED00010003 2026-07-07 15:40:47 2026-07-07 15:41:16 1 30 1
1 .0 3% | 103 2026-07-07 15:41:15 2026-07-07 15:41:15 1 1 1
--//注意看下划线,相关信息完成对上。
5.附上相关源代码:
$ cat lkpn21z.bt
BEGIN
{
printf("Tracing Oracle kgllkal/kglpnal... Target PID: %d\n", $1);
printf("Hit Ctrl-C to stop.\n\n");
}
//uprobe:oracle:kgllkal
uprobe:/u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle:kgllkal
/ $1 == 0 || pid == $1 /
{
@lk++;
@is_lock[pid] = 1;
printf("[%s] kgllkal #%02d pid=%d handle=%016lx mode=%d obj=%s\n",
strftime("%H:%M:%S", nsecs),
@lk, pid, arg2, arg3,
str(arg2 + 0x1c8, 256));
}
uprobe:/u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle:kglpnal
/ $1 == 0 || pid == $1 /
{
@pn++;
@is_pin[pid] = 1;
printf("[%s] kglpnal #%02d pid=%d handle=%016lx mode=%d obj=%s\n",
strftime("%H:%M:%S", nsecs),
@pn, pid, arg2, arg3,
str(arg2 + 0x1c8, 256));
}
uretprobe:/u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle:kglGetSO
/ $1 == 0 || pid == $1 /
{
if (@is_lock[pid] == 1) {
printf("[%s] kglGetSO pid=%d return LOCK ADDRESs=%016lx\n",
strftime("%H:%M:%S", nsecs), pid, retval);
delete(@is_lock[pid]);
}
if (@is_pin[pid] == 1) {
printf("[%s] kglGetSO pid=%d return PIN ADDRESS=%016lx\n",
strftime("%H:%M:%S", nsecs), pid, retval);
delete(@is_pin[pid]);
}
}
END
{
printf("\nTotal kgllkal: %d, Total kglpnal: %d\n", @lk, @pn);
delete(@lk);
delete(@pn);
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3175592/ ,如需转载,请注明出处,否则将追究法律责任。