實驗步驟如下:1、開會話1,先查出會話1的程序号7376
gyj@OCM> select spid from v$session s,v$process p where s.paddr=p.addr and sid in(select distinct sid from v$mystat);
SPID
------------------------
7376
2、重新整理buffer cache,目的就是讓select發生實體讀
gyj@OCM> alter system flush buffer_cache;
System altered.
3、通過程序号7376,打開gdb
[oracle@mydb ~]$ gdb $ORACLE_HOME/bin/oracle 7376
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
(no debugging symbols found)
Attaching to program: /u01/app/oracle/product/11.2.0/bin/oracle, process 7376
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libodm11.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libodm11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libcell11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libcell11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libskgxp11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libskgxp11.so
Reading symbols from /lib64/librt.so.1...done.
Loaded symbols for /lib64/librt.so.1
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libnnz11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libnnz11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libclsra11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libclsra11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libdbcfg11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libdbcfg11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libhasgen11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libhasgen11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libskgxn2.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libskgxn2.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libocr11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libocr11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libocrb11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libocrb11.so
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libocrutl11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libocrutl11.so
Reading symbols from /usr/lib64/libaio.so.1...done.
Loaded symbols for /usr/lib64/libaio.so.1
Reading symbols from /lib64/libdl.so.2...done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/libm.so.6...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libpthread.so.0...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x2b0b8fef0910 (LWP 7376)]
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /lib64/libnsl.so.1...done.
Loaded symbols for /lib64/libnsl.so.1
Reading symbols from /lib64/libc.so.6...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /usr/lib64/libnuma.so.1...done.
Loaded symbols for /usr/lib64/libnuma.so.1
Reading symbols from /lib64/libnss_files.so.2...done.
Loaded symbols for /lib64/libnss_files.so.2
Reading symbols from /u01/app/oracle/product/11.2.0/lib/libnque11.so...done.
Loaded symbols for /u01/app/oracle/product/11.2.0/lib/libnque11.so
0x0000003f0d40d290 in __read_nocancel () from /lib64/libpthread.so.0
(gdb)
4、在會話1,執行select語句,此時select被阻塞
gyj@OCM> select * from gyj_test where id=1;
5、在gdb設斷點,用等待事件的函數,并運作
(gdb) b kslwtbctx
Breakpoint 1 at 0x8f9a5c2
(gdb) c
Continuing.
6、查等待事件kslwtbctx函數的第一個參數,用指令info all-register顯示寄存器
(gdb) info all-register
rax 0x62657100 1650815232
rbx 0x15c 348
rcx 0x0 0
rdx 0x1 1
rsi 0x7a59 31321
rdi 0x7fff1c576d40 140733668879680
rbp 0x7fff1c576ce0 0x7fff1c576ce0
rsp 0x7fff1c576ce0 0x7fff1c576ce0
r8 0x2 2
r9 0x25 37
r10 0x7 7
r11 0x0 0
r12 0x0 0
r13 0xbb0c348 196133704
r14 0xbb09d40 196123968
r15 0x1 1
rip 0x8f9a5c2 0x8f9a5c2 <kslwtbctx+4>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
st0 0 (raw 0x00000000000000000000)
---Type <return> to continue, or q <return> to quit---
st1 0 (raw 0x00000000000000000000)
st2 0 (raw 0x00000000000000000000)
st3 0 (raw 0x00000000000000000000)
st4 0 (raw 0x00000000000000000000)
st5 0 (raw 0x00000000000000000000)
st6 73280 (raw 0x400f8f20000000000000)
st7 73280 (raw 0x400f8f20000000000000)
fctrl 0x27f 639
fstat 0x0 0
ftag 0xffff 65535
fiseg 0x0 0
fioff 0x9394e95 154750613
foseg 0x7fff 32767
fooff 0x1c573f50 475479888
fop 0x0 0
7、找到第一個參數rdi 0x7fff1c576d40
8、用x/32指令查記憶體中32個位元組
(gdb) x/32 0x7fff1c576d40
0x7fff1c576d40: 0x1c577a59 0x00007fff 0x1c576e50 0x00007fff
0x7fff1c576d50: 0x1c576ee0 0x00007fff 0x0918adf2 0x00000000
0x7fff1c576d60: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fff1c576d70: 0x00000000 0x00000001 0x00000000 0x00000000
0x7fff1c576d80: 0x002adb17 0x00000000 0x00000000 0x00000000
0x7fff1c576d90: 0x00000000 0x00000000 0x00000001 0x00000000
0x7fff1c576da0: 0x09b958cc 0x00000000 0x0000015c 0x00000000
0x7fff1c576db0: 0x7fffffff 0x00000000 0x62657100 0x00000000
9、找到0x0000015c,通過此等待事件号,找等待事件
gyj@OCM> select name from v$event_name where event# in(select to_number('15c','xxxxxxxxxxxxxx') from dual);
NAME
----------------------------------------------------------------
SQL*Net message to client
10、重複第5、6、7、8、9步(注用從第5步的c指令開始)
(gdb) c
Continuing.
Breakpoint 1, 0x0000000008f9a5c2 in kslwtbctx ()
(gdb) info all-register
rax 0x0 0
rbx 0x2000 8192
rcx 0x0 0
rdx 0x0 0
rsi 0x0 0
rdi 0x7fff1c574c38 140733668871224
rbp 0x7fff1c574970 0x7fff1c574970
rsp 0x7fff1c574970 0x7fff1c574970
r8 0x5bbb295 96187029
r9 0x2f8b5f0 49853936
r10 0x52da848e 1390052494
r11 0x2b0b9057e7a8 47328666314664
r12 0x99837da8 2575531432
r13 0x0 0
r14 0x0 0
r15 0x99437498 2571334808
rip 0x8f9a5c2 0x8f9a5c2 <kslwtbctx+4>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
st0 0 (raw 0x00000000000000000000)
---Type <return> to continue, or q <return> to quit---
st1 0 (raw 0x00000000000000000000)
st2 0 (raw 0x00000000000000000000)
st3 0 (raw 0x00000000000000000000)
st4 0 (raw 0x00000000000000000000)
st5 0 (raw 0x00000000000000000000)
st6 73280 (raw 0x400f8f20000000000000)
st7 73280 (raw 0x400f8f20000000000000)
fctrl 0x27f 639
fstat 0x0 0
ftag 0xffff 65535
fiseg 0x0 0
fioff 0x9394e95 154750613
foseg 0x7fff 32767
fooff 0x1c573f50 475479888
fop 0x0 0
xmm0 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm2 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm3 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0, 0x0, 0x0, 0x0, 0x54, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0x0, 0x0, 0x354, 0x1, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x10354, 0x0, 0x0}, v2_int64 = {
0x1035400000000, 0x0}, uint128 = 0x00000000000000000001035400000000}
xmm4 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x64, 0x0 <repeats 15 times>}, v8_int16 = {0x64, 0x0,
---Type <return> to continue, or q <return> to quit---
0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x64, 0x0, 0x0, 0x0}, v2_int64 = {0x64, 0x0}, uint128 = 0x00000000000000000000000000000064}
xmm5 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x32, 0xa3, 0xd7, 0x2, 0x0 <repeats 12 times>},
v8_int16 = {0xa332, 0x2d7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x2d7a332, 0x0, 0x0, 0x0}, v2_int64 = {0x2d7a332, 0x0},
uint128 = 0x00000000000000000000000002d7a332}
xmm6 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm7 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0xda, 0x87, 0xd7, 0x2, 0x0 <repeats 12 times>},
v8_int16 = {0x87da, 0x2d7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x2d787da, 0x0, 0x0, 0x0}, v2_int64 = {0x2d787da, 0x0},
uint128 = 0x00000000000000000000000002d787da}
xmm8 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm9 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm10 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm11 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm12 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x18, 0xe, 0x73, 0x90, 0xb, 0x2b, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v8_int16 = {0xe18, 0x9073, 0x2b0b, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x90730e18, 0x2b0b, 0x0, 0x0},
v2_int64 = {0x2b0b90730e18, 0x0}, uint128 = 0x000000000000000000002b0b90730e18}
xmm13 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm14 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
xmm15 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0,
---Type <return> to continue, or q <return> to quit---
0x0, 0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0}, uint128 = 0x00000000000000000000000000000000}
mxcsr 0x1fa1 [ IE PE IM DM ZM OM UM PM ]
(gdb)
(gdb) x/32 0x7fff1c574c38
0x7fff1c574c38: 0x08f97a59 0x00000000 0x9079c6d8 0x00002b0b
0x7fff1c574c48: 0x90742970 0x00002b0b 0x9079c748 0x00002b0b
0x7fff1c574c58: 0x1c574df0 0x00007fff 0x9079c748 0x00002b0b
0x7fff1c574c68: 0x9079c6d8 0x00002b0b 0x00000000 0x00000000
0x7fff1c574c78: 0x00000000 0x00000000 0x00000013 0x20000000
0x7fff1c574c88: 0x00000000 0x00000000 0x00000001 0x00000000
0x7fff1c574c98: 0x0a0fcd50 0x00000000 0x00000092 0x00000000
0x7fff1c574ca8: 0x7fffffff 0x00000000 0x00000006 0x00000000
(gdb)
11、找到0x00000092,通過此等待事件号,找等待事件0x00000092
gyj@OCM> gyj@OCM> select name from v$event_name where event# in(select to_number('92','xxxxxxxxxxxxxx') from dual);
NAME
----------------------------------------------------------------
db file sequential read
說明此時會話1發生了實體讀(db file sequential read等待事件你懂我)
12、打開會話2(此會話2号的SID=146),并在會話2執行SELECT語句,此時SELECT也被阻塞了
gyj@OCM> select sid from v$mystat where rownum=1;
SID
----------
146
gyj@OCM> select * from gyj_test where id=1;
13、打開一個會話3,看會話2(此會話2号的SID=146)的等待事件
sys@OCM> select sid ,event from v$session_wait where sid=146 and wait_class<>'Idle';
SID EVENT
---------- ----------------------------------------------------------------
146 read by other session
哈哈。。。終于發現了read by other session等待事件,以後可以用同樣的方法去研究其它等待事件!