ITPub博客

首页 > 数据库 > Oracle > [20241112]验证sql_idz.sh计算PLSQL代码块2.txt

[20241112]验证sql_idz.sh计算PLSQL代码块2.txt

原创 Oracle 作者:lfree 时间:2024-11-13 20:55:50 0 删除 编辑

[20241112]验证sql_idz.sh计算PLSQL代码块2.txt

--//测试验证sql_idz.sh计算PLSQL代码块是否正确,我以前测试过
--//参考链接 :[20240902]验证sql_idz.sh计算PLSQL代码块.txt

1.环境:
SYS@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.测试:
SCOTT@book> exec lcp

SYS@book> @ sharepool/shp4 '' 1715433582
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40             KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- --------------- -------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   000000008888F1C0 000000008888F550 BEGIN lcp; END;        1          2          0 0000000088AD5C10 0000000087AC6770       4488      12400       3049     19937      19937 1715433582 g097g0jm3yw3f          0
parent handle address  000000008888F550 000000008888F550 BEGIN lcp; END;        1          0          0 00000000877B4C38 00                     4704          0          0      4704       4704 1715433582 g097g0jm3yw3f      65535

$ ext_kglob.sh 000000008888F550 1a8
(gdb) 0x8888f6f8:       "BEGIN lcp; END;\n"
(gdb) quit

$ sql_idz.sh "BEGIN lcp; END;\n\0" 3
sql_text = BEGIN lcp; END;\n\0
full_hash_value(16) = 53975D1AA6F69DF9EE36A6C55F8DD007 or 53975d1aa6f69df9ee36a6c55f8dd007
xxxxx_matching_signature(10) = -1281653677298429945 or  17165090396411121671
hash_value(10) = 1603129351 or hash_value(16) = 5F8DD007 or 5f8dd007
sql_id(16) = EE36A6C55F8DD007 or ee36a6c55f8dd007
sql_id(32) = fwdp6spgsvn07
sql_id(32) = fwdp6spgsvn07
sql_id(32) = fwdp6spgsvn07
--//计算不对。

--//使用md5.gdb跟踪。
Breakpoint 1, 0x00000000097dc75c in kggmd5Update ()
Length: 18
0x7ffc88028588: 66 'B'  69 'E'  71 'G'  73 'I'  78 'N'  32 ' '  108 'l' 99 'c'
0x7ffc88028590: 112 'p' 59 ';'  32 ' '  69 'E'  78 'N'  68 'D'  59 ';'  10 '\n'
0x7ffc88028598: 0 '\000'        0 '\000'

--//代码如下:
BEGIN lcp; END;\n\0\0
--//结尾是\0\0.

$ sql_idz.sh "BEGIN lcp; END;\n\0\0" 3
sql_text = BEGIN lcp; END;\n\0\0
full_hash_value(16) = FEE7CD985905C2A1F024EF04663F706E or fee7cd985905c2a1f024ef04663f706e
xxxxx_matching_signature(10) = -1142525603270922130 or  17304218470438629486
hash_value(10) = 1715433582 or hash_value(16) = 663F706E or 663f706e
sql_id(16) = F024EF04663F706E or f024ef04663f706e
sql_id(32) = g097g0jm3yw3f
sql_id(32) = g097g0jm3yw3f
sql_id(32) = g097g0jm3yw3f
--//这样计算正确。
--//为什么出现\0\0呢。
--//实际上真正执行的是这样。
BEGIN lcp; END;
/

--//[20240902]验证sql_idz.sh计算PLSQL代码块.txt的测试完全不同,这里补了两个\0.

3.md5.gdb代码:
set pagination off
set logging file /tmp/md5.log
set logging overwrite on
set logging on

break kggmd5Update
  commands
    printf "Length: %d\n",$rdx
    x/18xc $rsi
    c
  end
 
break kglComputeHash
  commands
    c
  end
 
break kggmd5Process
  commands
    c
  end
 
break kggmd5Finish
  commands
    c
  end


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3048672/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970751