[20241114]建立完善ext_kglob.sh指令碼.txt

lfree發表於2024-11-16
[20241114]建立完善ext_kglob.sh指令碼.txt

--//以前考慮使用管道問題,我考慮複雜了,看了gdb文件,實際上gdb -ex引數支援在命令列加入執行命令。
--//選擇使用mmon後臺程序,改寫如下:
$ cat ext_kglob.sh
#/bin/bash
# extrace object string from object handle address
# arg1=address arg2=offset (default 1c8) arg3=length (default 1)

offset=${2:-1c8}
length=${3:-1}
gdb -q -batch -p $(pgrep -f ora_mmon_${ORACLE_SID}) -ex "x/${length}s 0x${1}+0x${offset}" -ex "quit" | grep "^0x" | grep -v "^0x0"

--//21c下偏移在0x1c8,11g下偏移在1a8,根據環境需要修改。
--//該工具僅僅建議在測試環境學習使用。
--//簡單驗證看看:
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.

$ ext_kglob.sh 0000000062B283D0
0x62b28598: "select * from dept where deptno=40"

--//如果你不確定定位偏移或者不對,可以透過簡單的方法執行確定:
$ ext_kglob.sh 0000000062B283D0 0 816 | grep -i select
0x62b28598: "select * from dept where deptno=40"
--//21c下偏移在0x1c8,11g下偏移在1a8,根據環境需要修改。
--//0x62b28598-0x0000000062B283D0 = 0x1c8

--//看看錶dept物件。
$ sql_idz.sh 'DEPT.SCOTT.BOOK01P\x1\0\0\0' 3
sql_text = DEPT.SCOTT.BOOK01P\x1\0\0\0
full_hash_value(16) = 05DB243908B3C797B99628590EDB820C or 05db243908b3c797b99628590edb820c
xxxxx_matching_signature(10) = -5073823567219817972 or 13372920506489733644
hash_value(10) = 249266700 or hash_value(16) = 0EDB820C or 0edb820c
sql_id(16) = B99628590EDB820C or b99628590edb820c
sql_id(32) = bm5j8b47dr0hc
sql_id(32) = bm5j8b47dr0hc
sql_id(32) = bm5j8b47dr0hc

SYS@book> @ sharepool/shp4p '' 249266700
SYS@book> @ pr
==============================
HANDLE_TYPE : parent handle address
KGLHDADR : 0000000062B02760
KGLHDPAR : 0000000062B02760
C40 : DEPT.SCOTT
KGLHDLMD : 0
KGLHDPMD : 0
KGLHDIVC : 0
KGLOBHD0 : 0000000062B02070
KGLOBHD6 : 00
KGLOBHS0 : 4064
KGLOBHS6 : 0
KGLOBT16 : 0
N0_6_16 : 4064
N20 : 4064
KGLNAHSH : 249266700
KGLOBT03 :
KGLOBT09 : 0
PL/SQL procedure successfully completed.

$ ext_kglob.sh 0000000062B02760
0x62b02928: "DEPTSCOTTBOOK01P\030F\260b"
--//後面取到一些亂碼是正常的。

--//順便SQL測試中間出現\0會是怎麼情況。

$ echo -e "select 'A\0' from dual;" >| gg1.txt
$ xxd -c 16 gg1.txt
0000000: 7365 6c65 6374 2027 4100 2720 6672 6f6d select 'A.' from
0000010: 2064 7561 6c3b 0a dual;.

SCOTT@book01p> set echo on
SCOTT@book01p> @ gg1.txt;
SCOTT@book01p> select 'A
2 ;
ERROR:
ORA-01756: quoted string not properly terminated
--//sqlplus在讀取到chr(0)時中斷了,變成不正確的sql語句,無法測試。

$ ext_kglob.sh 00000000623AF968
0x623afb30: "select 'A\001' from dual"
--//換成\01的測試結果。

相關文章