1 gdb调试core文件并输出堆栈信息
1.1 执行三种不同的调试方法:服务启动前、服务运行中、服务已退出,有多种方式的尽量都列出
1.1.1 服务启动前
使用gdb启动dmserver,并使用run(r)命令指定运行dm.ini,启动数据库



1.1.2 执行问题SQL
1.1.3 输入bt,查看相应堆栈信息
1.1.4 输入info threads,查看线程信息
1.2 服务运行中
1.2.1 查询到已运行的dmserver进程,拿到对应PID号
ps -ef|grep dmserver

1.2.2 使用gdb 命令进入gdb页面,再执行attach PID


1.2.3 输入c,继续运行

1.2.4 执行问题SQL
1.2.5 可以看到执行到mem2_unprotect()函数时中断执行,LWP为4503
1.2.6 输入bt,输出堆栈信息
1.3 服务已退出
1.3.1 执行问题SQL,数据库直接core掉
1.3.2 启用gdb程序对core文件进行分析
gdb /dmdata/data/DAMENG/dmservice /dmdata/core/core-xxxx
1.3.3 输入bt,查看相应的堆栈信息
1.3.4 输入info threads,查看线程信息
2 如何将gdb调试中的结果输出到文件
将调试结果输出到文件中需要执行以下步骤:
2.1 指定日志文件(可加路径,文件自动生成)
set logging file /home/dmdba/stack.log
2.2 启用日志模式
set logging on
2.3 ----调试过程----
thread apply all bt
2.4 关闭日志模式
set logging off
3 列出gdb调试中常规的几个命令
3.1 gdb读取core文件
[root@localhost bin]# gdb ./dmserver core文件名
3.2 定义存储堆栈的文件名
(gdb) set logging file corexxx.txt
3.3 开始向文件中写入
(gdb) set logging on
3.4 记录当前所有崩溃线程堆栈
(gdb) thread apply all bt
3.5 关闭向文件中写入
(gdb) set logging off
3.6 记录当前崩溃线程堆栈:
(gdb) bt
3.7 记录当前崩溃线程号:
(gdb) info threads
前面有*为当前线程,LWP后面为线程号.
4 通过dmrdc抓取SQL语句
4.1 使用dmrdc工具生成SQL语句,并生成到指定文件中
[dmdba@ora11g ~]$ dmrdc sfile=/dmdata/core/core-disql-1890-11 dfile=/dmdata/core/core_250603.txt
4.2 查看结果
5 通过symbols调试core并输出堆栈信息
5.1 解压symbols包到数据库bin目录symbols下
5.2 利用symbols中dmserver_s.debug进行调试
