首页 > 其他分享 >[20240824]利用gdb抽取kglnaobj内容.txt

[20240824]利用gdb抽取kglnaobj内容.txt

时间:2024-08-25 20:37:00浏览次数:5  
标签:20240824 dept gdb emp ---------- deptno txt select

[20240824]利用gdb抽取kglnaobj内容.txt

--//上午测试跟踪library cache lock library cache pin使用gdb,利用handle addreess+0x1c8偏移可以取出kglnaobj内容.
--//灵光一现,是否可以直接通过gdb抽取kglnaobj内容,新的gdb版本支持管道操作,在测试环境尝试一下.
--//千万不要在生产系统做这样的测试!!!!

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.测试:
SCOTT@book01p> select * from dept,emp where dept.deptno=emp.deptno;
...
--//输出略.

SCOTT@book01p> @ hash

HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
1395733917 cxuafv59m2dcx            0      79261       844388907  5331359d  2024-08-24 15:05:27    16777216

SYS@book> @sharepool/shp4x cxuafv59m2dcx 0
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   0000000066074120 0000000069ED8BB0 select * from dept,emp where dept.deptno          0          0          0 000000006CDABDA8 0000000066155518       8128      28320       3316     39764      39764 1395733917 cxuafv59m2dcx          0
parent handle address  0000000069ED8BB0 0000000069ED8BB0 select * from dept,emp where dept.deptno          0          0          0 0000000069470058 00                     4064          0          0      4064       4064 1395733917 cxuafv59m2dcx      65535
--//parent handle address = 0000000069ED8BB0

$ echo x/s 0x0000000069ED8BB0+0x1c8 | gdb -q
(gdb) 0x69ed8d78:       <Address 0x69ed8d78 out of bounds>
(gdb) quit

$ echo x/s 0x0000000069ED8BB0+0x1c8 | gdb -q $(which oracle)
Reading symbols from /u01/app/oracle/product/21.0.0/dbhome_1/bin/oracle...done.
(gdb) 0x69ed8d78:       <Address 0x69ed8d78 out of bounds>
(gdb) quit
--//以上两个方式都报错,<Address 0x69ed8d78 out of bounds>。以为gdb没有指定程序防蚊范围.

--//取出当前会话进程号看看。
SCOTT@book01p> @ spid
       SID    SERIAL# PROCESS                  SERVER    SPID                               PID  P_SERIAL# C50
---------- ---------- ------------------------ --------- ------------------------------ ------- ---------- --------------------------------------------------
       403      52380 3539                     DEDICATED 3541                                95          3 alter system kill session '403,52380' immediate;

$  echo x/s 0x0000000069ED8BB0+0x1c8 | gdb -q -p  3541 | grep "^(gdb)"
(gdb) 0x69ed8d78:       "select * from dept,emp where dept.deptno=emp.deptno"
(gdb) quit
--//OK,没有问题.

--//换1个进程ora_dbw0_book看看.
$ ps -ef | grep ora_dbw0_boo[k]
oracle    3066     1  0 15:03 ?        00:00:00 ora_dbw0_book

$  echo x/s 0x0000000069ED8BB0+0x1c8 | gdb -q -p  3066 | grep "^(gdb)"
(gdb) 0x69ed8d78:       "select * from dept,emp where dept.deptno=emp.deptno"
(gdb) quit
--//OK没有问题.这样只要知道ora_dbw0_book进程就可以实现这个功能.

3.写脚本:
$ cat  ./ext_kglobj.sh
#/bin/bash
echo x/s 0x${1}+0x1c8 | gdb -q -p $(pgrep ora_dbw0_${ORACLE_SID}) | grep '^(gdb)'

$ source ./ext_kglobj.sh 0000000069ED8BB0
(gdb) 0x69ed8d78:       "select * from dept,emp where dept.deptno=emp.deptno"
(gdb) quit

4.继续尝试:

SCOTT@book01p> select * from dept  
  2  ,emp
  3  where dept.deptno=emp.deptno;

SCOTT@book01p> @ hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
1207303074 b7fucgx3zbyx2            0     129954       844388907  47f5fba2  2024-08-24 15:21:20    16777216

SYS@book> @sharepool/shp4x b7fucgx3zbyx2 0

HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   0000000069F2E688 0000000069F2FDE8 select * from dept ,emp where dept.deptn          0          0          0 0000000069F2E4C8 0000000069F2F410       8080      28320       3317     39717      39717 1207303074 b7fucgx3zbyx2          0
parent handle address  0000000069F2FDE8 0000000069F2FDE8 select * from dept ,emp where dept.deptn          0          0          0 0000000069F2FC28 00                     4064          0          0      4064       4064 1207303074 b7fucgx3zbyx2      65535

$ source ./ext_kglobj.sh 0000000069F2FDE8
(gdb) 0x69f2ffb0:       "select * from dept\n,emp\nwhere dept.deptno=emp.deptno"
(gdb) quit

--//测试超长文本看看:

$ cat aa.txt
select /*+
012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890
....
012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890
*/ sysdate from dual;

SCOTT@book01p> @ aa.txt

SYSDATE
-------------------
2024-08-24 15:27:19

SCOTT@book01p> @ hash

HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
1191379888 47ug7hp3h60xh            0      66480      1388734953  470303b0  2024-08-24 15:27:18    16777216

SYS@book> @sharepool/shp4x 47ug7hp3h60xh 0
HANDLE_TYPE            KGLHDADR         KGLHDPAR         C40                                        KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
child handle address   00000000633E9680 000000006A5194D0 select /*+ 01234567890012345678900123456          0          0          0 0000000064E23A70 0000000069F7D948       4032      12128       8084     24244      24244 1191379888 47ug7hp3h60xh          0
parent handle address  000000006A5194D0 000000006A5194D0 select /*+ 01234567890012345678900123456          0          0          0 0000000063DBB9E0 00                     4064          0          0      4064       4064 1191379888 47ug7hp3h60xh      65535
*/

$ source ./ext_kglobj.sh 000000006A5194D0
(gdb) 0x6a519698:       "select /*+\n012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890\n01234567890012345678900123456789001234567890012345678900"...
(gdb) quit

--//超长sql语句分成多个chunk,仅仅取开头部分.

4.取一个表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
sql_id(32) = bm5j8b47dr0hc
sql_id(32) = bm5j8b47dr0hc
sql_id(32) = bm5j8b47dr0hc

SYS@book> @ kglob 0 249266700
==============================
INST_ID                       : 1
OWNER                         : SCOTT
NAME                          : DEPT
DB_LINK                       :
NAMESPACE                     : TABLE/PROCEDURE
TYPE                          : TABLE
NAMESPACE_NUM                 : 1
NAMESPACE_HEX                 : 1
SHARABLE_MEM                  : 4064
LOADS                         : 4
EXECUTIONS                    : 0
LOCKS                         : 0
PINS                          : 0
KEPT                          : NO
CHILD_LATCH                   : 98828
INVALIDATIONS                 : 0
HASH_VALUE                    : 249266700
LOCK_MODE                     : NONE
PIN_MODE                      : NONE
STATUS                        : VALID
TIMESTAMP                     : 2024-08-16/09:33:38
PREVIOUS_TIMESTAMP            :
LOCKED_TOTAL                  : 4
PINNED_TOTAL                  : 4
PROPERTY                      :
FULL_HASH_VALUE               : 05db243908b3c797b99628590edb820c
CON_ID                        : 3
CON_NAME                      : BOOK01P
ADDR                          : 0000000068FAC470
EDITION                       :
SQL_ID                        :
OBJECT_STR                    : DEPT.SCOTT.BOOK01P\x1\0\0\0
PL/SQL procedure successfully completed.
--//ADDR: 0000000068FAC470

$ source ./ext_kglobj.sh 0000000068FAC470
(gdb) 0x68fac638:       "DEPTSCOTTBOOK01PPj9n"
(gdb) quit

--//后面不对,没有限制的长度,前面部分正确没有问题。
--//最后还是提示不要在生产系统做这类尝试。

标签:20240824,dept,gdb,emp,----------,deptno,txt,select
From: https://www.cnblogs.com/lfree/p/18379500

相关文章

  • [20240824]跟踪library cache lock library cache pin使用gdb.txt
    [20240824]跟踪librarycachelocklibrarycachepin使用gdb.txt--//这几天一直想写一个gdb脚本实现这个功能,先开始自己尝试,遇到一些问题,冷静下来看了以前的学习笔记,网上查了相关链接,能找到--//的资源很少:--//https://nenadnoveljic.com/blog/tracing-library-cache-locks/......
  • GDB:调试时传递参数
    有时需要在通过gdb调试的时候,向程序传递命令行参数,假设如下程序:#include<iostream>usingnamespacestd;intmain(intargc,char*argv[]){for(inti=0;i<argc;i++){cout<<i<<":"<<argv[i]<<endl;}retu......
  • 使用Java导出MySQL数据:支持自定义分隔符的TXT文件生成
    在软件开发中,我们经常需要将数据库中的数据导出为文件,给关联系统做传输或者进行数据备份、迁移或分析。常见的导出格式包括CSV和TXT文件,分隔符可以是逗号、制表符或其他符号。本文将深入探讨如何使用Java从MySQL数据库中导出数据,并支持用户自定义分隔符来生成格式化的TXT文件。......
  • Linux下安装CGDB,并升级GDB
    下载CGDB创建文件夹mkdircgdbcdcgdbcgdb:Consolefront-endtotheGNUdebugger-GitCode克隆gitclonehttps://gitcode.com/gh_mirrors/cg/cgdb.git进入进入cgdb目录,一步步执行:./configure--prefix=/usr/localmakemakeinstall 参考linux安装cgdb_conf......
  • 本地ip防火墙 txt ip脚本自己填 论行不带空格的带回车的
    ///////////////////////////////////////////////////////////编译release’发布版本‘#include<Windows.h>#include<stdlib.h>#pragmacomment(lib,"WS2_32.lib")#include<corecrt_wstdlib.h>#include<iostream>#include<stdio.......
  • [20240818]测试21c下sqlplus show recyclebin的小问题2.txt
    [20240818]测试21c下sqlplusshowrecyclebin的小问题2.txt--//以前测试过,链接[20210722]sqlplus下showrecycebin的小问题.txt--//注:recycebin拼写错误应该是recyclebin.--//这个问题当时也是浪费了大量实际,我记忆遇到问题时是上午,执行showrecyclebin;[注空格+;],linux......
  • TXT 记录解析怎么做?
    在当今数字化的时代,网络技术的应用越来越广泛,而域名系统(DNS)则是网络通信中至关重要的一部分。TXT记录作为DNS中的一种记录类型,有着特定的用途和解析方法。那么,TXT记录解析究竟该怎么做呢?一、了解TXT记录的概念TXT记录,即文本记录,是一种可以存储任意文本信息的DNS记录类......
  • Python 实现Word和TXT文本相互转换
    Word文档(.doc或.docx)和纯文本文件(.txt)是两种常用的文件格式。Word文档通常用于复杂的文档处理和排版,而纯文本文件则用于存储和传输纯文本信息。了解如何在这两种格式之间进行转换能提高工作效率,并便于文件管理。本文将详细介绍如何使用Python实现Word和TXT文件格式之间的相互转换......
  • c++ (2-0) 从txt读取和保存数据
     CMakeLists.txt #设置CMake的最小版本要求cmake_minimum_required(VERSION3.10)#设置项目名称和版本project(PoseSaverVERSION1.0)#设置C++标准为C++11set(CMAKE_CXX_STANDARD11)set(CMAKE_CXX_STANDARD_REQUIREDTrue)#查找Eigen库find_packa......
  • [20240815]oracle21c环境变量ORACLE_PATH与SQLPATH(windows).txt
    [20240815]oracle21c环境变量ORACLE_PATH与SQLPATH(windows).txt--//我记忆以前测试过这个问题,当时是家里的笔记本,安装oracle12.2cforwindows.OS:windows7,发现无法访问SQLPATH或者--//ORACLE_PATH环境变量定义的路径下login.sql文件.我当时解决办法就是登录手工执行init.sq......