[20250606]跟踪library cache lock/library cache pin使用systemtap.txt --//以前写过跟踪library cache lock/library cache pin使用gdb,今天尝试使用SystemTap(stap)。 --//首先声明一点,我不熟悉这些调试跟踪工具,一边通过上网查询资料一边编写完成: --//SystemTap(stap)简单介绍如下: SystemTap(stap) 是一个用于动态调试 Linux 系统的脚本语言和工具,以下是关于它的详细介绍: 基本概念 定义 :SystemTap 是一个免费、开源的工具,它允许用户编写脚本以动态地探测和监控运行中的 Linux 系统,包括内核和用户空间的应 用程序,无需重新编译或修改目标软件。 组成 :主要包括系统tap语言和stap命令行工具。其中,stap 是 SystemTap 的前端程序,用于接受探测指令、翻译脚本、生成和编译内 核模块,并将生成的内核模块加载到正在运行的 Linux 内核中以执行系统跟踪或探测功能。 主要特点 动态性 :无需重启系统或重新编译内核,即可动态插入和移除探测器,对系统运行影响小。 强大功能 :能访问内核数据结构、函数参数和返回值等,可详细分析系统性能瓶颈、安全漏洞等。 易用性 :脚本语言类似 C 和 awk,有丰富函数库,且红帽等发行版提供良好支持和集成,方便安装和使用。 工作原理 1. 脚本编写 :用户使用 SystemTap 脚本语言编写脚本,脚本中指定了要探测的内核事件或用户空间应用程序事件,以及相应的处理逻辑。 2. 脚本翻译 :stap 命令将脚本翻译成 C 代码,并生成一个内核模块,这个模块与 SystemTap 运行时库链接。 3. 模块加载与执行 :生成的内核模块被加载到正在运行的 Linux 内核中,系统会安排该模块与内核交互,执行探测任务,如数据采集等。 4. 数据输出与清理 :探测任务完成,采集的数据会输出到屏幕或指定文件中,staprun 命令会卸载模块并清理相关资源。 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 2.编写stp脚本: --//首先确定oracle执行文件的全路径: $ which oracle /u01/app/oracle/product/11.2.0.4/db_1/bin/oracle $ cat lkpn11g.stp global lk=0, pn=0 #globak off_set=0 probe begin { printf("Begin.\n") } probe process("/u01/app/oracle/product/11.2.0.4/db_1/bin/oracle").function("kgllkal") { printf("spid=%d :%s lk_count %d -- handle address: %x , mode = %d , kglnaobj : %s\n", pid(), ppfunc(),++lk, long_arg(2),long_arg(3),user_string(long_arg(2)+0x1a8)); } probe process("/u01/app/oracle/product/11.2.0.4/db_1/bin/oracle").function("kglpnal") { printf("spid=%d :%s pn_count %d -- handle address: %x , mode = %d , kglnaobj : %s\n", pid(), ppfunc(),++pn, long_arg(2),long_arg(3),user_string(long_arg(2)+0x1a8)); # printf("%d\t%s: %s %x %x %d\n", pid(), execname(), ppfunc(), int_arg(1),long_arg(2),long_arg(3)); } --//简单说明获取的参数2就是相应对象的句柄地址,参数3时mode。 --//参数2加上一个偏移0x1a8地址指向的内容就是对象的具体内容。使用user_string转换为字符串,好像遇到\0结束。 --//11g的偏移是0x1a8,21c的偏移是0x1c8,也许各个版本的偏移也许数值不同可以通过oradebug peek确定。 3.测试: --//首先执行desc dept,Select * from dept where deptno=40;多次,主要目的避免大量的递归语句。 --//注意Select第1个字母大写。 SCOTT@book> @ spid ============================== SID : 133 SERIAL# : 7 PROCESS : 3444 SERVER : DEDICATED SPID : 3445 PID : 26 P_SERIAL# : 3 KILL_COMMAND : alter system kill session '133,7' immediate; PL/SQL procedure successfully completed. --//记下进程号3445,然后打开新的终端,注意以root用户执行如下: --//一个简单的技巧,先以oracle用户登录,然后执行su root登录root用户(注意没有中间的-),这样执行sqlplus不需要输入全路径。 # stap -v /home/oracle/study/202501/lkpn11g.stp -x 3445 --tmpdir=/tmp Pass 1: parsed user script and 138 library scripts using 238648virt/49176res/3240shr/46624data kb, in 410usr/20sys/437real ms. Pass 2: analyzed script: 4 probes, 6 functions, 4 embeds, 4 globals using 304800virt/116456res/4408shr/112776data kb, in 580usr/90sys/680real ms. Pass 3: using cached /root/.systemtap/cache/ef/stap_ef74e607e0915fa29ac8260dd2b00726_11665.c Pass 4: using cached /root/.systemtap/cache/ef/stap_ef74e607e0915fa29ac8260dd2b00726_11665.ko Pass 5: starting run. Begin. --//然后切换到oracle会话执行sql语句: SCOTT@book> select * from dept where deptno=40; DEPTNO DNAME LOC ---------- ------------------------------ ------------- 40 OPERATIONS BOSTON --//s小写 SCOTT@book> select * from dept where deptno=40; DEPTNO DNAME LOC ---------- ------------------------------ ------------- 40 OPERATIONS BOSTON SCOTT@book> select * from dept where deptno=40; DEPTNO DNAME LOC ---------- ------------------------------ ------------- 40 OPERATIONS BOSTON SCOTT@book> select * from dept where deptno=40; DEPTNO DNAME LOC ---------- ------------------------------ ------------- 40 OPERATIONS BOSTON SCOTT@book> @ 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 2025-06-06 10:13:07 16777220 --//第1次执行 spid=3445 :kgllkal lk_count 1 -- handle address: 8887bc30 , mode = 1 , kglnaobj : select * from dept where deptno=40 spid=3445 :kglpnal pn_count 1 -- handle address: 8887bc30 , mode = 2 , kglnaobj : select * from dept where deptno=40 spid=3445 :kgllkal lk_count 2 -- handle address: 8f980a08 , mode = 2 , kglnaobj : bookSYS spid=3445 :kgllkal lk_count 3 -- handle address: 8887b920 , mode = 2 , kglnaobj : 127a7727e93393b7$BUILD$ spid=3445 :kgllkal lk_count 4 -- handle address: 8887b7b0 , mode = 1 , kglnaobj : --//没有显示 spid=3445 :kglpnal pn_count 2 -- handle address: 8887b7b0 , mode = 3 , kglnaobj : --//没有显示 spid=3445 :kgllkal lk_count 5 -- handle address: 8f980a08 , mode = 2 , kglnaobj : bookSYS spid=3445 :kgllkal lk_count 6 -- handle address: 85fa5890 , mode = 1 , kglnaobj : 79ab1de2f29642c4127a7727e93393b7Child:0 spid=3445 :kglpnal pn_count 3 -- handle address: 85fa5890 , mode = 3 , kglnaobj : 79ab1de2f29642c4127a7727e93393b7Child:0 spid=3445 :kgllkal lk_count 7 -- handle address: 87bd2b18 , mode = 1 , kglnaobj : SCOTT spid=3445 :kgllkal lk_count 8 -- handle address: 8f980a08 , mode = 2 , kglnaobj : bookSYS spid=3445 :kgllkal lk_count 9 -- handle address: 87aa23c0 , mode = 2 , kglnaobj : DEPTSCOTT spid=3445 :kglpnal pn_count 4 -- handle address: 87aa23c0 , mode = 2 , kglnaobj : DEPTSCOTT --//第2次执行 spid=3445 :kgllkal lk_count 10 -- handle address: 8887bc30 , mode = 1 , kglnaobj : select * from dept where deptno=40 spid=3445 :kgllkal lk_count 11 -- handle address: 8887b7b0 , mode = 1 , kglnaobj : --//没有显示 spid=3445 :kgllkal lk_count 12 -- handle address: 87aa23c0 , mode = 2 , kglnaobj : DEPTSCOTT spid=3445 :kglpnal pn_count 5 -- handle address: 87aa23c0 , mode = 2 , kglnaobj : DEPTSCOTT --//第3次执行 spid=3445 :kgllkal lk_count 13 -- handle address: 8887bc30 , mode = 1 , kglnaobj : select * from dept where deptno=40 spid=3445 :kgllkal lk_count 14 -- handle address: 8887b7b0 , mode = 1 , kglnaobj : --//没有显示 --//这里实际上子游标的句柄,大部分情况下显示乱码,实际上对象在父游标句柄里面。 --//第4次执行 --//没有输出: SYS@book> @ sharepool/shp4 14ymr4znm74xr '' HANDLE_TYPE KGLHDADR KGLHDPAR C40 KGLHDLMD KGLHDPMD KGLHDIVC KGLOBHD0 KGLOBHD6 KGLOBHS0 KGLOBHS6 KGLOBT16 N0_6_16 N20 KGLNAHSH KGLOBT03 KGLOBT09 ---------------------- ---------------- ---------------- ---------------------------------------- ---------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ---------- child handle address 000000008887B7B0 000000008887BC30 select * from dept where deptno=40 1 0 0 0000000085FA5AC8 000000008574A770 4528 12144 3067 19739 19739 3912471479 14ymr4znm74xr 0 parent handle address 000000008887BC30 000000008887BC30 select * from dept where deptno=40 1 0 0 000000008887BB78 00 4720 0 0 4720 4720 3912471479 14ymr4znm74xr 65535 --//注意KGLHDADR就是句柄地址,与stp的输出可以对上。 --//关于lock pin的地址这部分内容以后完善看看。 --//kglGetSO to allocate the library cache state object. kglGetSO returns the lock address.
[20250606]跟踪library cache lock/library cache pin使用systemtap.txt
来源:这里教程网
时间:2026-03-03 22:03:07
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 免费获得 Oracle MOS 账号的秘密,技术爱好者必看!
免费获得 Oracle MOS 账号的秘密,技术爱好者必看!
26-03-03 - 呼唤县城老表,快来买新能源车
呼唤县城老表,快来买新能源车
26-03-03 - 中国宏桥是如何炼成“模范生”的?
中国宏桥是如何炼成“模范生”的?
26-03-03 - “China AI 60”:大摩给百融云盖了章
“China AI 60”:大摩给百融云盖了章
26-03-03 - 1-Oracle Database 23ai Free Container install-Podman
- 19c多租户架构下的UNDO管理-19c多租户架构下的UNDO管理- Local Undo
- 2-Oracle 23ai free-Podman&True Cache 基本操作
- 数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)
- Oracle 如何实现AI自然语言查询
Oracle 如何实现AI自然语言查询
26-03-03 - weblogic12.2以上版本补丁安装标准化实施文档
weblogic12.2以上版本补丁安装标准化实施文档
26-03-03
