[20241113]建立显示某个内存段的通用脚本disp_addr.sh.txt

来源:这里教程网 时间:2026-03-03 20:49:33 作者:

[20241113]建立显示某个内存段的通用脚本disp_addr.sh.txt --//该工具仅仅建议在测试环境学习使用。 $ cat disp_addr.sh #/bin/bash # display address information # arg1=address arg2=offset arg3=length arg4=format offset=${2:-0} length=${3:-8} format=${4-wx} if [ "$format" == "s" ] ; then         len=1 fi if [ "$format" == "S" ] ; then         format="s" fi gdb -q -batch -p $(pgrep -f ora_mmon_${ORACLE_SID}) -ex "x/${length}${format} 0x${1}+0x${offset}" -ex "quit" |  grep "^0x" | grep -v "^0x0" --//简单介绍正常wx格式显示。如果以字符串输出,输入s(小写)时,长度等于1.输入S(大写),改成小写,不修改length值。 SCOTT@book01p> select * from dept where deptno=40;     DEPTNO DNAME                          LOC ---------- ------------------------------ -------------         40 OPERATIONS                     BOSTON SCOTT@book01p> @ hash HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID ---------- ------------- ------------ ---------- --------------- ---------- ------------------- ----------- 3912471479 14ymr4znm74xr            0     103351      2852011669  e93393b7  2024-11-14 09:18:39    16777216 SYS@book> @ sharepool/shp4p 14ymr4znm74xr 0 SYS@book> @ pr ============================== HANDLE_TYPE                   : parent handle address KGLHDADR                      : 0000000062B283D0 KGLHDPAR                      : 0000000062B283D0 C40                           : select * from dept where deptno=40 KGLHDLMD                      : 0 KGLHDPMD                      : 0 KGLHDIVC                      : 0 KGLOBHD0                      : 0000000062B28210 KGLOBHD6                      : 00 KGLOBHS0                      : 4064 KGLOBHS6                      : 0 KGLOBT16                      : 0 N0_6_16                       : 4064 N20                           : 4064 KGLNAHSH                      : 3912471479 KGLOBT03                      : 14ymr4znm74xr KGLOBT09                      : 65535 PL/SQL procedure successfully completed. --//KGLHDPAR : 0000000062B283D0 $ ./disp_addr.sh 0000000062B283D0 1c8 1 s 0x62b28598:     "select * from dept where deptno=40" --//如果不知道偏移可以这样写。 SYS@book> @ fchaz 0000000062B283D0 LOC KSMCHPTR           KSMCHIDX   KSMCHDUR KSMCHCOM           KSMCHSIZ KSMCHCLS   KSMCHTYP KSMCHPAR         KSMCHPTR_BEGIN   KSMCHPTR_END+1 --- ---------------- ---------- ---------- ---------------- ---------- -------- ---------- ---------------- ---------------- ----------------- SGA 0000000062B283A0          1          1 KGLHD                   816 recr             80 00               0000000062B283A0 0000000062B286D0 --//该chunk占用818字节。 $ ./disp_addr.sh 0000000062B283D0 0 816 S | grep -i select 0x62b28598:     "select * from dept where deptno=40" --//0x62b28598-0x0000000062B283D0 = 0x1c8,偏移在0x1c8位置。 --//带入816越界没有问题。 --//前面@hash的输出KGL_BUCKET=103351 SYS@book> oradebug setmypid Statement processed. SYS@book> oradebug dump library_cache 4; Statement processed. SYS@book> @ t TRACEFILE -------------------------------------------------------------------------------- /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_3719.trc $ grep 103351 /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_3719.trc Bucket: #=103351 Mutex=0x7309f5c0(639950127104, 11, 0, 6) --//mutex地址在0x7309f5c0。 $ ./disp_addr.sh 7309f5c0 0 6 wx 0x7309f5c0:     0x00000000      0x00000000      0x0000000b      0x00000000 0x7309f5d0:     0x000193b7      0x00000000 --//gets=0xb. --//0x000193b7 = 103351,等于KGL_BUCKET值。 $ ./disp_addr.sh 7309f5b0 0 8 wx 0x7309f5b0:     0x62b283d0      0x00000000      0x62b283d0      0x00000000 0x7309f5c0:     0x00000000      0x00000000      0x0000000c      0x00000000 --//0x62b283d0就是该sql语句父游标句柄地址。 SCOTT@book01p> select * from dept where deptno=40;     DEPTNO DNAME                          LOC ---------- ------------------------------ -------------         40 OPERATIONS                     BOSTON $ ./disp_addr.sh 7309f5b0 0 12 wx 0x7309f5b0:     0x62b283d0      0x00000000      0x62b283d0      0x00000000 0x7309f5c0:     0x00000000      0x00000000      0x0000000d      0x00000000 0x7309f5d0:     0x000193b7      0x00000000      0x62820b38      0x00000000 --//gets=0xd.增加1. --//每执行1次查看1次。 $ ./disp_addr.sh 7309f5b0 0 12 wx 0x7309f5b0:     0x62b283d0      0x00000000      0x62b283d0      0x00000000 0x7309f5c0:     0x00000000      0x00000000      0x0000000e      0x00000000 0x7309f5d0:     0x000193b7      0x00000000      0x62820b38      0x00000000 $ ./disp_addr.sh 7309f5b0 0 12 0x7309f5b0:     0x62b283d0      0x00000000      0x62b283d0      0x00000000 0x7309f5c0:     0x00000000      0x00000000      0x0000000e      0x00000000 0x7309f5d0:     0x000193b7      0x00000000      0x62820b38      0x00000000 --//光标缓存后gets不在增加。

相关推荐