错误信息的获取途径有几种 :
1. 最简单的就是看PostgreSQL的log文件.
2. 在PostgreSQL中可以使用psql的 \set VERBOSITY verbose 来输出详细的错误信息,
3. 或者使用linux的strace跟踪这个发生错误的进程.
4. 使用gdb (GNU Debugger) 来调试则是一种比较深入但是非常有用的工具.
下面就以前面我在使用pgsql_fdw时遇到的问题使用gdb来做个简单的演示 :
要让postgresql能够使用gdb进行调试, 首先要在编译PostgreSQL时打开enable-debug.
例如, 使用如下方法编译 :
在满足这个条件后, 初始化数据库
使用gdb进行调试 :
会话1 :
获取当前进程的pid.
会话2 :
使用gdb, 绑定到会话1获取到的进程PID.
在出错的函数处设置断点(b getTypeOutputInfo) :
执行那个报错的函数 :
继续执行(c), 跟踪到getTypeOutputInfo的输入参数如下 :
查看截止到断点前的所有调用(bt或backtrace) :
注意这里的结果和实际的调用顺序是反的, 如, #1的execute_query调用了#0的getTypeOutputInfo
其他常用gdb指令 :
next
nexti
【参考】
1. (gdb) 是gdb的命令行提示符.
2. http://en.wikipedia.org/wiki/GNU_Debugger
3. http://wiki.postgresql.org/wiki/Pgsrcstructure
4. gdb 所有指令 :
(gdb) help all