[20241108]跟踪library cache lock library cache pin使用gdb(11g)4.txt --//验证前面建立的gdb脚本确定library cache pin address是否正确. 1.环境: SCOTT@book> @ver1 PORT_STRING VERSION BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production --//grant execute on sys.dbms_lock to scott; create procedure lcp is begin sys.dbms_lock.sleep(3600); end; / 2.测试: --//session 1: SCOTT@book> exec lcp() --//session 2: SCOTT@book> @spid ============================== SID : 53 SERIAL# : 31 PROCESS : 20523 SERVER : DEDICATED SPID : 20524 PID : 27 P_SERIAL# : 15 KILL_COMMAND : alter system kill session '53,31' immediate; PL/SQL procedure successfully completed. SCOTT@book> set timing on --//window 2: $ rlgdb -f -p 20524 -x lkpn11g.gdb --//session 2: SCOTT@book> alter procedure lcp compile; --//这样编译挂起!! --//window 2: kglGetS0 return pin address : 000000007ce3fdb8 000000007ce3fdb8 kgllkal count 49 -- handle address: 000000007c468fc8, mode: 3 kglnaobj address:0x7c469170: "LCPSCOTT\210覭|" kglGetS0 return lock address : 000000007c13b6d0 000000007c13b6d0 kglpnal count 22 -- handle address: 000000007c468fc8, mode: 3 kglnaobj address:0x7c469170: "LCPSCOTT\210覭|" kglGetS0 return pin address : 000000007c13b4d0 000000007c13b4d0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --//session 4: SYS@book> @ ashtop event,p1raw,p2raw,p3raw 1=1 &min Total Distinct Distinct Distinct Seconds AAS %This EVENT P1RAW P2RAW P3RAW FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------------------------------------ ----------------- ----------------- ----------------- ------------------- ------------------- ---------- -------- ----------- 60 1.0 100% | library cache pin 000000007C468FC8 000000007C13B4D0 0001759800010003 2024-11-08 10:29:53 2024-11-08 10:30:52 1 60 1 --//P2raw就是pin的地址000000007C13B4D0,可以发现完全对上,没有问题. SYS@book> @ ev_namepr 'library cache pin' ============================== EVENT# : 286 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 PL/SQL procedure successfully completed. --//P1=000000007C468FC8对应句柄地址. $ ./ext_kglobz.sh 000000007C468FC8 '' 1a8 0x7c469170: "LCPSCOTT\210覭|" SYS@book> select * from x$kglpn where KGLpnadr='000000007C13B4D0'; ADDR INDX INST_ID KGLPNADR KGLPNUSE KGLPNSES KGLPNSID KGLPNHDL KGLPNLCK KGLPNCNT KGLPNMOD KGLPNREQ KGLPNFLG KGLPNDMK KGLPNSPN KGLNAHSH ---------------- ---------- ---------- ---------------- ---------------- ---------------- ---------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 00007FAF5A01ED08 2 1 000000007C13B4D0 0000000085D109F8 0000000085D109F8 53 000000007C468FC8 00 0 0 3 4096 0 1077 3309827384 --//奇怪,oracle这个x表竟然没有类似x$kgllk.KGLNAOBJ字段. SYS@book> @ sharepool/shp4 '' 3309827384 HANDLE_TYPE KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 ---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- parent handle address 000000007C468FC8 000000007C468FC8 LCP.SCOTT 3 2 0 000000007BF0ED90 00 4688 0 0 4688 16976 3309827384 0 --//一样可以定位对象是LCP.SCOTT. 3.继续: --//如果在打开一个会话执行编译,出现library cache lock: --//session 3: SCOTT@book> @ spid ============================== SID : 138 SERIAL# : 9 PROCESS : 20610 SERVER : DEDICATED SPID : 20611 PID : 32 P_SERIAL# : 5 KILL_COMMAND : alter system kill session '138,9' immediate; PL/SQL procedure successfully completed. --//window 3: $ rlgdb -f -p 20611 -x lkpn11g.gdb --//session 3: alter procedure lcp compile; --//window 3,按c继续: ... kglGetS0 return lock address : 000000007c1da1e0 000000007c1da1e0 kgllkal count 24 -- handle address: 000000007c08b128, mode: 1 kglnaobj address:0x7c08b2d0: "" kglGetS0 return lock address : 000000007c1da0e0 000000007c1da0e0 kgllkal count 25 -- handle address: 000000007c468fc8, mode: 3 kglnaobj address:0x7c469170: "LCPSCOTT8括}" kglGetS0 return lock address : 000000007c1d9fe0 000000007c1d9fe0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --//lock address=000000007c1d9fe0 --//session 4: SYS@book> @ ashtop event,p1raw,p2raw,p3raw 1=1 &min Total Distinct Distinct Distinct Seconds AAS %This EVENT P1RAW P2RAW P3RAW FIRST_SEEN LAST_SEEN Execs Seen Tstamps Execs Seen1 --------- ------- ------- ------------------------------------------ ----------------- ----------------- ----------------- ------------------- ------------------- ---------- -------- ----------- 60 1.0 50% | library cache lock 000000007C468FC8 000000007C1D9FE0 0001759800010003 2024-11-08 10:42:01 2024-11-08 10:43:00 1 60 1 60 1.0 50% | library cache pin 000000007C468FC8 000000007C13B4D0 0001759800010003 2024-11-08 10:42:01 2024-11-08 10:43:00 1 60 1 1 .0 1% | 2024-11-08 10:42:30 2024-11-08 10:42:30 1 1 1 --//EVENT=library cache lock,P1都是一样,P2=000000007C1D9FE0,与前面gdb的跟踪一致. --//顺便解析P3,PARAMETER3 : 100*mode+namespace --//拆解几个部分 00017598 0001 0003 ,第2部分是namespace ,第3部分mode,注意intel系列cpu的大小头问题. --//前面第一部分实际上lcp对象的object_id. SYS@book> @ o2 scott.lcp owner object_name object_type SEG_PART_NAME status OID D_OID CREATED LAST_DDL_TIME ------------------------- ------------------------------ -------------------- -------------------- --------- ---------- ---------- ------------------- ------------------- SCOTT LCP PROCEDURE VALID 95640 2024-11-08 10:25:26 2024-11-08 10:25:26 --//95640 = 0x17598,正好对应对象的Object_id.如果阻塞是sql语句,这部分不存在的. 4.整理后gdb代码如下: --//注意:每个测试环境不同,调用kglGetSO的返回地址会发生变化的,你必须根据自己的测试环境修改代码。 --//我不知道如何写脚本实现调用kglGetSO返回时,获取寄存器值。 $ cat lkpn11g.gdb2 set pagination off set print repeats 0 set print elements 0 set logging file /tmp/lkpn.log set logging overwrite on set logging on set $lk = 0 set $pn = 0 set $lock = 0 #break kgllkal if $rdx==3 #break kgllkal if ( $rdx==3 && $rsi==0x00000000670C9E58 ) #break kgllkal if $rsi==0x00000000670C9E58 break kgllkal commands silent printf "kgllkal count %02d -- handle address: %016x, mode: %d ", ++$lk ,$rsi ,$rdx echo kglnaobj address: x/s $rsi+0x1a8 c end #break kglpnal if $rcx==3 break kglpnal commands silent printf "kglpnal count %02d -- handle address: %016x, mode: %d ", ++$pn ,$rsi ,$rdx echo kglnaobj address: x/s $rsi+0x1a8 c end #break kglGetSO #commands # silent # finish # end break *0x000000000983db73 commands silent printf "kglGetS0 return lock address : %016x %016x\n", $rax,$rdx c end break *0x000000000983a048 commands silent printf "kglGetS0 return pin address : %016x %016x\n", $rax,$rdx c end
[20241108]跟踪library cache lock library cache pin使用gdb(11g)4.txt
来源:这里教程网
时间:2026-03-03 20:52:37
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- Oracle 统一审计- Best 实践四
Oracle 统一审计- Best 实践四
26-03-03 - Oracle SQL语句为什么不走索引-场景三
Oracle SQL语句为什么不走索引-场景三
26-03-03 - 数据库去O搞了个寂寞!甲骨文股价翻倍,市值突破5200亿美金!
数据库去O搞了个寂寞!甲骨文股价翻倍,市值突破5200亿美金!
26-03-03 - Oracle 统一审计- Best 实践五
Oracle 统一审计- Best 实践五
26-03-03 - 查询DBA_FREE_SPACE缓慢问题
查询DBA_FREE_SPACE缓慢问题
26-03-03 - Oracle Linux 8.10 图形化安装 Oracle Database 21c
- 长沙岳麓区家具馆:邂逅高颜值餐桌,开启优雅用餐时光
长沙岳麓区家具馆:邂逅高颜值餐桌,开启优雅用餐时光
26-03-03 - 芯片行业ERP系统设计需要考虑哪些因素
芯片行业ERP系统设计需要考虑哪些因素
26-03-03 - 软件签名添加时间戳
软件签名添加时间戳
26-03-03 - OPatch安装补丁将Oracle 19.3升级到19.23
OPatch安装补丁将Oracle 19.3升级到19.23
26-03-03
