ITPub博客

首页 > 数据库 > Oracle > [20250901]使用gdb的rbreak命令了解oracle内部调用的函数.txt

[20250901]使用gdb的rbreak命令了解oracle内部调用的函数.txt

原创 Oracle 作者:lfree 时间:2025-09-09 20:54:07 3 删除 编辑

[20250901]使用gdb的rbreak命令了解oracle内部调用的函数.txt

--//可以利用gdb的rbreak命令特性找需要的函数。不过在学习过程还是遇到一些问题,做一个记录:

1.使用nm命令:

--//以前喜欢通过nm命令了解oracle内部调用的函数或者过程。

$ nm $(which oracle) | grep kgl.*Mutex
0000000015370830 T kglGetBucketMutex
0000000015371280 T kglGetHandleMutex
00000000153712c0 T kglGetMutex
00000000137b43b0 T kglIsAnyMutexHeld
0000000015370800 T kglIsHandleMutexHeld
0000000015370c30 T kglIsMutexHeld
00000000058f8690 T kglMutexCleanup
00000000058f8780 t kglMutexCleanupAll
0000000015371790 T kglMutexHeld
000000001a327760 d kglMutexLocations
0000000015370c80 T kglMutexNotHeld
00000000137a9930 t kglMutexRecovery
00000000058f8600 t kglMutexWait
00000000058f8700 T kglOnErrorMutexCleanup
00000000059289f0 T kglReleaseAllMutex
0000000015370890 T kglReleaseBucketMutex
00000000153708e0 T kglReleaseMutex
00000000137a9e00 T kglSessionMutexHeld

--//缺点不知道是否遗漏,可能还存在许多库文件。
$ ldd $(which oracle)
        linux-vdso.so.1 =>  (0x00007ffe39159000)
        libofs.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libofs.so (0x00007fb9ea72d000)
        libskgxp.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libskgxp.so (0x00007fb9ea408000)
        libskjcx.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libskjcx.so (0x00007fb9ea1ba000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fb9e9f8a000)
        liboevm.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/liboevm.so (0x00007fb9e9d67000)
        libclsra.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libclsra.so (0x00007fb9e9b22000)
        libdbcfg.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libdbcfg.so (0x00007fb9e98f5000)
        libhasgen.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libhasgen.so (0x00007fb9e8b00000)
        libocr.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libocr.so (0x00007fb9e87d5000)
        libocrb.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libocrb.so (0x00007fb9e84ba000)
        libocrutl.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libocrutl.so (0x00007fb9e8297000)
        libaio.so.1 => /lib64/libaio.so.1 (0x00007fb9e8095000)
        libons.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libons.so (0x00007fb9e7e31000)
        libmql1.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libmql1.so (0x00007fb9e7bca000)
        libipc1.so => /u01/app/oracle/product/21.0.0/dbhome_1/lib/libipc1.so (0x00007fb9e7719000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb9e7515000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fb9e7212000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb9e6ff6000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb9e6ddc000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb9e6a1a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb9ea930000)

2.下载ora_functions:

--//网站orafun.info可以查询oracle c functions.Created by Frits Hoogland with a little help from Kamil Stawiarski.
--//可以通过它了解oracle 内部C 函数.实际上可以直接下载相关文件,在本地使用.

https://gitlab.com/FritsHoogland/ora_functions/archive/master/ora_functions-master.tar.gz
https://gitlab.com/FritsHoogland/ora_functions

--//直接使用grep命令过滤查询相关信息。

$ grep ^kgl.*Mutex functions.csv
kglGetBucketMutex|get mutex for KGL hash table bucket, calls kglGetMutex
kglGetMutex|get mutex
kglIsMutexHeld|validate mutex, returns pointer to AOL
kglMutexHeld|validate mutex state with AOL
kglOnErrorMutexCleanup|on error mutexes cleanup. called to cleanup mutexes when an error has occured.
kglReleaseBucketMutex|release mutex for KGL hash table bucket, calls kglReleaseMutex
kglReleaseMutex|release mutex

$ ./lookup.awk kglGetMutex
kglGetMutex : kernel generic library cache management get mutex

3.昨天学习gdb rbreak命令:

(gdb) help rbreak
Set a breakpoint for all functions matching REGEXP.

--//可以利用这个特性找需要的函数。不过在学习过程还是遇到一些问题,做一个记录:

(gdb)  rbreak *Mutex*
--//没有输出。

--//尝试如下:
$ grep *Mutex* functions.csv
$ grep "*Mutex*" functions.csv

--//难道这样写正则表达式存在问题? 星号表示字符出现0次或者多次。我的例子前面*前面没有字符,我估计当作真实的*。

$ echo "*MutexAAA" | grep *Mutex
*MutexAAA
~~~~~~
--//grep有彩色设置,这里通过下划线表示。这里还是注意一些细节问题,bash shell上的正则表达式不同,bash shell不使用双引号会
--//展开,不小心很容易犯错。

$ touch AMutex
$ echo "*MutexAAA" | grep *Mutex
--//没有输出,实际上相当于grep AMutex。

$ echo "*MutexAAA" | grep "*Mutex"
*MutexAAA

$ ls -l *g1*
-rw-r--r--. 1 oracle oinstall 621 2025-07-14 15:55:08 g1.txt
--//bash shell上的正则表达式与其他地方的正则表达式有一点点不同,不小心很容易犯错!!

(gdb) rbreak Mutex
(gdb) rbreak .*Mutex
--//两者都有输出,输出太多省略。

(gdb) rbreak kgl*Mutex*
Note: breakpoints 1, 22, 123 and 220 also set at pc 0x58f8600.
Breakpoint 302 at 0x58f8600
<function, no debug info> kglMutexWait;
Note: breakpoints 2, 23, 124 and 221 also set at pc 0x58f8690.
Breakpoint 303 at 0x58f8690
<function, no debug info> kglMutexCleanup;
Note: breakpoints 3, 25, 126 and 223 also set at pc 0x58f8780.
Breakpoint 304 at 0x58f8780
<function, no debug info> kglMutexCleanupAll;
Note: breakpoints 4, 65, 166 and 263 also set at pc 0x137a9930.
Breakpoint 305 at 0x137a9930
<function, no debug info> kglMutexRecovery;
Note: breakpoints 5, 90, 191 and 288 also set at pc 0x15370c80.
Breakpoint 306 at 0x15370c80
<function, no debug info> kglMutexNotHeld;
Note: breakpoints 6, 93, 194 and 291 also set at pc 0x15371790.
Breakpoint 307 at 0x15371790
<function, no debug info> kglMutexHeld;

--//正则表达式有时候真的很复杂,没有kglGetMutex的输出。这里可以理解理解为
--//kgl*Mutex* 包含l出现0次或者多次。

(gdb) rbreak kgl.*Mutex
Breakpoint 1 at 0x58f8600
<function, no debug info> kglMutexWait;
Breakpoint 2 at 0x58f8690
<function, no debug info> kglMutexCleanup;
Breakpoint 3 at 0x58f8700
<function, no debug info> kglOnErrorMutexCleanup;
Breakpoint 4 at 0x58f8780
<function, no debug info> kglMutexCleanupAll;
Breakpoint 5 at 0x59289f0
<function, no debug info> kglReleaseAllMutex;
Breakpoint 6 at 0x137a9930
<function, no debug info> kglMutexRecovery;
Breakpoint 7 at 0x137a9e00
<function, no debug info> kglSessionMutexHeld;
Breakpoint 8 at 0x137b43b0
<function, no debug info> kglIsAnyMutexHeld;
Breakpoint 9 at 0x15370800
<function, no debug info> kglIsHandleMutexHeld;
Breakpoint 10 at 0x15370830
<function, no debug info> kglGetBucketMutex;
Breakpoint 11 at 0x15370890
<function, no debug info> kglReleaseBucketMutex;
Breakpoint 12 at 0x153708e0
<function, no debug info> kglReleaseMutex;
Breakpoint 13 at 0x15370c30
<function, no debug info> kglIsMutexHeld;
Breakpoint 14 at 0x15370c80
<function, no debug info> kglMutexNotHeld;
Breakpoint 15 at 0x15371280
<function, no debug info> kglGetHandleMutex;
Breakpoint 16 at 0x153712c0
<function, no debug info> kglGetMutex;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Breakpoint 17 at 0x15371790
<function, no debug info> kglMutexHeld;

--//rbreak有一个缺点没有参数支持忽略大小写的查询:

(gdb)  rbreak  kglgetmutex
--//没有结果。

(gdb)  rbreak  kgl[gG]et[mM]utex
Note: breakpoints 1, 2 and 3 also set at pc 0x153712c0.
Breakpoint 4 at 0x153712c0
<function, no debug info> kglGetMutex;

4.小结:
--//利用gdb的rbreak命令特性找需要的函数.
--//注意正则表达式使用的细节问题。


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

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

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969192