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

来源:这里教程网 时间:2026-03-03 22:43:24 作者:

[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命令特性找需要的函数. --//注意正则表达式使用的细节问题。

相关推荐