--------------------------gdb..study first---------------------
--1 connect db and get processid
select spid from v$process where addr in (select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
--16795
--2 gdb the prcesss
gdb -p 16795
---------------------
rac1-> gdb -p 16795
GNU gdb Red Hat Linux (6.3.0.0-1.162.el4rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
Attaching to process 16795
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/bin/oracle...(no debugging symbols found)...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libskgxp10.so...(no debugging symbols found)...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libskgxp10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libhasgen10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libhasgen10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libskgxn2.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libskgxn2.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libocr10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libocr10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libocrb10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libocrb10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libocrutl10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libocrutl10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libjox10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libjox10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libclsra10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libclsra10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libdbcfg10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libdbcfg10.so
Reading symbols from /u01/app/oracle/product/10.2.0/db_1/lib/libnnz10.so...done.
Loaded symbols for /u01/app/oracle/product/10.2.0/db_1/lib/libnnz10.so
Reading symbols from /usr/lib/libaio.so.1...done.
Loaded symbols for /usr/lib/libaio.so.1
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/tls/libpthread.so.0...done.
[Thread debugging using libthread_db enabled]
[New Thread -163010880 (LWP 16795)]
Loaded symbols for /lib/tls/libpthread.so.0
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
0x005107a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
--3. 在gdb中,在latch的获取和释放的函数上设置断点
--3 create table t as select * from dba_objects
--and select count(*) from t
(gdb) b kslgpl
(gdb) b kslgetsl
(gdb) b kslgpl
(gdb) b kslg2c
(gdb) b kslg2csl
(gdb) b kslgprl
(gdb) b kslfre
(gdb) b kslf2c
(gdb) b kslfpl
(gdb) b kslfal
(gdb) b kslfpl0
(gdb)
--注:最后几个函数只是猜测跟latch有关....latch的请求和释放所调用的函数主要为:kslgetl、kslgetsl和
(gdb) b kslgpl
Breakpoint 1 at 0x83137df
(gdb) b kslgetsl
Breakpoint 2 at 0x8307bdd
(gdb) b kslgpl
Note: breakpoint 1 also set at pc 0x83137df.
Breakpoint 3 at 0x83137df
(gdb) b kslg2c
Breakpoint 4 at 0x8313c86
(gdb) b kslg2csl
Breakpoint 5 at 0x8313d4e
(gdb) b kslgprl
Breakpoint 6 at 0x8312786
(gdb) b kslfre
Breakpoint 7 at 0x83095d5
(gdb) b kslf2c
Breakpoint 8 at 0x8313e1e
(gdb) b kslfpl
Breakpoint 9 at 0x8313c16
(gdb) b kslfal
Breakpoint 10 at 0x830cffe
(gdb) b kslfpl0
Breakpoint 11 at 0x8313a79
(gdb) c
Continuing.
[Switching to Thread -163010880 (LWP 16795)]
Breakpoint 2, 0x08307bdd in kslgetsl ()
(gdb) info f
Stack level 0, frame at 0xfeffce30:
eip = 0x8307bdd in kslgetsl; saved eip 0x83e669c
called by frame at 0xfeffce6c
Arglist at 0xfeffce28, args:
Locals at 0xfeffce28, Previous frame's sp is 0xfeffce30
Saved registers:
ebp at 0xfeffce28, eip at 0xfeffce2c
(gdb) x /10 0xfeffce28
0xfeffce28: 0xfeffce64 0x083e669c 0x2af2c1f8 0x00000001
0xfeffce38: 0x2af0b458 0x00000050 0x00000008 0xfeffce64
0xfeffce48: 0x2af0b458 0x0cbc2b3c
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) info f
Stack level 0, frame at 0xfeffce40:
eip = 0x83095d5 in kslfre; saved eip 0x83e66d5
called by frame at 0xfeffce6c
Arglist at 0xfeffce38, args:
Locals at 0xfeffce38, Previous frame's sp is 0xfeffce40
Saved registers:
ebp at 0xfeffce38, eip at 0xfeffce3c
(gdb) x /10x 0xfeffce38
0xfeffce38: 0xfeffce64 0x083e66d5 0x2af2c1f8 0xfeffce64
0xfeffce48: 0x2af0b458 0x0cbc2b3c 0x0cbc2a40 0x00000002
0xfeffce58: 0x00000000 0x2ababf68
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) info f
Stack level 0, frame at 0xfeffba28:
eip = 0x83095d5 in kslfre; saved eip 0x8319eb3
called by frame at 0xfeffba40
Arglist at 0xfeffba20, args:
Locals at 0xfeffba20, Previous frame's sp is 0xfeffba28
Saved registers:
ebp at 0xfeffba20, eip at 0xfeffba24
(gdb) x /10x 0xfeffce38
0xfeffce38: 0x00000001 0xfeffed24 0x00000005 0xfeff0000
0xfeffce48: 0x2af000a4 0x0cbc0000 0x0cbc2a00 0x00000002
0xfeffce58: 0x0cbc2a40 0x0cbc2b3c
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) info f
Stack level 0, frame at 0xfeffba68:
eip = 0x83095d5 in kslfre; saved eip 0x8319eb3
called by frame at 0xfeffba80
Arglist at 0xfeffba60, args:
Locals at 0xfeffba60, Previous frame's sp is 0xfeffba68
Saved registers:
ebp at 0xfeffba60, eip at 0xfeffba64
(gdb) x /10x 0xfeffba60
0xfeffba60: 0xfeffba78 0x08319eb3 0x20095908 0x0cb740c0
0xfeffba70: 0x0cbc2a40 0x0000000c 0xfeffbad4 0x0abf08a1
0xfeffba80: 0x0cbc2a40 0x20095908
(gdb) x /10x $seb+8 -- 应该相当于数据库开发过程中的调试过程
Argument to arithmetic operation not a number or boolean.
(gdb) x /10x $sbp+8
Argument to arithmetic operation not a number or boolean.
(gdb) x /10x $ebp+8
0xfeffba68: 0x20095908 0x0cb740c0 0x0cbc2a40 0x0000000c
0xfeffba78: 0xfeffbad4 0x0abf08a1 0x0cbc2a40 0x20095908
0xfeffba88: 0x27490a98 0x20095908
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) x /10x $ebp+8
0xfeffb904: 0x297c3a74 0x0cb740c0 0xfeffc0dc 0x2ab271b4
0xfeffb914: 0xfeffbaac 0x0ae874a7 0x0cbc2a40 0x297c3a74
0xfeffb924: 0x00000096 0x4e9aeb9b
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) x /10x $ebp+8
0xfeffb890: 0x2a449840 0x00000000 0x00000000 0x2ab27210
0xfeffb8a0: 0x00000000 0x00000000 0x00000001 0x20001b28
0xfeffb8b0: 0x2ab27208 0x297c4214
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) info f
Stack level 0, frame at 0xfeffb4e4:
eip = 0x83095d5 in kslfre; saved eip 0x8319eb3
called by frame at 0xfeffb4fc
Arglist at 0xfeffb4dc, args:
Locals at 0xfeffb4dc, Previous frame's sp is 0xfeffb4e4
Saved registers:
ebp at 0xfeffb4dc, eip at 0xfeffb4e0
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) x /10x $ebp+8
0xfeffa8e0: 0x20095908 0x0cb740c0 0x00000000 0x2001b9ec
0xfeffa8f0: 0xfeffa97c 0x0abecbc1 0x0cbc2a40 0x20095908
0xfeffa900: 0x00000001 0x00000430
---Type
Quit
(gdb) info f
Stack level 0, frame at 0xfeffa8e0:
eip = 0x83095d5 in kslfre; saved eip 0x8319eb3
called by frame at 0xfeffa8f8
Arglist at 0xfeffa8d8, args:
Locals at 0xfeffa8d8, Previous frame's sp is 0xfeffa8e0
Saved registers:
ebp at 0xfeffa8d8, eip at 0xfeffa8dc
(gdb) x /10x $ebp+8
0xfeffa8e0: 0x20095908 0x0cb740c0 0x00000000 0x2001b9ec
0xfeffa8f0: 0xfeffa97c 0x0abecbc1 0x0cbc2a40 0x20095908
0xfeffa900: 0x00000001 0x00000430
(gdb) x /10x $ebp+8
0xfeffa8e0: 0x20095908 0x0cb740c0 0x00000000 0x2001b9ec
0xfeffa8f0: 0xfeffa97c 0x0abecbc1 0x0cbc2a40 0x20095908
0xfeffa900: 0x00000001 0x00000430
(gdb) x /10x $ebp+8
0xfeffa8e0: 0x20095908 0x0cb740c0 0x00000000 0x2001b9ec
0xfeffa8f0: 0xfeffa97c 0x0abecbc1 0x0cbc2a40 0x20095908
0xfeffa900: 0x00000001 0x00000430
(gdb) c
Continuing.
Breakpoint 7, 0x083095d5 in kslfre ()
(gdb) x /10x $ebp+8
0xfeffa878: 0x20095908 0x0cb740c0 0x00000000 0x2001b9ec
0xfeffa888: 0xfeffa914 0x0abecbc1 0x0cbc2a40 0x20095908
0xfeffa898: 0x2a966454 0x00000430
(gdb) info f
Stack level 0, frame at 0xfeffa878:
eip = 0x83095d5 in kslfre; saved eip 0x8319eb3
called by frame at 0xfeffa890
Arglist at 0xfeffa870, args:
Locals at 0xfeffa870, Previous frame's sp is 0xfeffa878
Saved registers:
ebp at 0xfeffa870, eip at 0xfeffa874
(gdb) q
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /u01/app/oracle/product/10.2.0/db_1/bin/oracle, process 16795'
---以上是设置内存断点 进行验证....内部函数 这个或许是一种方法而已,不打算研究很深
--------------------------gdb..study second---------------------
Linux GDB调试基本用法
基本的使用方法简介
程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,
大部分的错误都可以归类为执行时错误。GDB 的功能便是寻找执行时错误。如果没有除错程序,
我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了 GDB 除错程序,
我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。
一个除错程序执行的流程通常是这样的:
1. 进入除错程序并指定可执行文件。
2. 指定程序代码所在目录。
3. 设定断点后执行程序。
4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值
(2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。
5. 离开除错程序。
以下将分为下列数项分别介绍:
1. 进入 GDB 及指定可执行档
2. 指定程序代码所在目录及检视程序代码
3. 断点的设定与清除
4. 全速及逐步执行程序
5. 检视及更改变量值
6. 检视程序执行状态
7. 读取 Core 文件信息
进入 GDB 及指定可执行档:
1. 进入 GDB 并读入可执行档 (档名为 'PROGRAM'),准备进行除错。
gdb PROGRAM
指定程序代码所在目录及检视程序代码
1. 增加目录 DIR 到收寻程序代码的目录列表 (如果你的程序代码和可执行档放在同一个目录下,就不须指定程序代码所在目录。):
(gdb) directory DIR
2. 检视程序代码,格式计有:
(gdb) list => 显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码
(gdb) list function => 显示该程序开始处前后五行的程序代码。
(gdb) list - =>上次显示程序代码的前面的十行。
断点的设定与清除
1. 设定断点(指令为 break,可简写为 (b),格式计有:
(gdb) break filename.c:30 => 在 filename.c 的第三十行处停止执行。
(gdb) break function => 在进入 function 时中断程序的执行。
(gdb) break filename.c:function => 在程序代码档 filename.c 中的函数 function 处设定断点。
(gdb) break => 在下一个将被执行的命令设定断点。
(gdb) break ... if cond => 只有当 cond 成立的时候才中断。cond 须以 C 语言的语法写成。
2. 显示各个断点的信息。
(gdb) info break
3. 清除断点(命令为 clear),格式同 break 。例如 :
(gdb) clear filename.c:30
4. 清除断点,NUM 是在 info break 显示出来的断点编号。
(gdb) delete NUM
全速及逐步执行程序
1. 从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止。
(gdb) run
2. 在程序被中断后,全速执行程序到下一个断点或是程序结束为止 (continue 指令可简写为 c)。
(gdb) continue
3. 执行一行程序. 若呼叫函数, 则将该包含该函数程序代码视为一行程序 (next 指令可简写为 n)。
(gdb) next
4. 执行一行程序. 若呼叫函数, 则进入函数逐行执行 (step 指令可简写为 s)。
(gdb) step
5. 执行一行程序,若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until 指令可简写为 u)。
(gdb) until
6. 执行现行程序到回到上一层程序为止。
(gdb) finish
检视及更改变量值
1. print 叙述,显示该叙述执行的结果 (print 指令可简写为 p)。如
(gdb) print a => 显示 a 变量的内容.
(gdb) print sizeof(a) => 显示 a 变量的长度.
2. display 叙述,在每个断点或是每执行一步时显示该叙述值。如
(gdb) display a
3. 更改变量值:
(gdb) print (a=10) => 将变量 a 的值设定为 10.
检视程序执行状态
1. 查看程序执行到此时,是经过哪些函数呼叫的程序 (backtrace 指令可简写为 bt),也就是查看函数呼叫堆栈。
(gdb) backtrace
读取 Core 文件信息
1. 读入 PROGRAM 及 PROGRAM.CORE 档,可检视 Core Dump 时程序变量值及程序流程状态 。
gdb PROGRAM core
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9879835/viewspace-1055732/ ,如需转载,请注明出处,否则将追究法律责任。