一,debug准备工作。
- ./configure CFLAGS “-g -O0” 先编译个debug版本
- 创建示例库company,department
- ltsql连上 执行 select pg_backend_pid();
二,采用emacs + gdb的方式调试
-
echo ‘(setq gdb-many-windows 1)’ >> ~/.emacs
-
打开emacs 执行gdb
-
执行att $pid,后设置断点。效果如下:
-
在gdb中执行,可以格式出输出结构体内容
set print pretty on
三,打印结构体内容
假设想查看List *的ptr_value的内容,但不知道是啥类型。如有个查询树 Query *result
- 如果类型未知先 p result[0] ,会输出整个结构体。
- 现在 想查看result->rtable, 先p result->rtable[0], 发现是个list *, 查看list的定义得知,list->elements->ptr_value是保存数据的地址。是void *
- 将void * 将转为 Node * 并打印 p ((Node *)result->rtable[0]->elements[0])[0],输出 type = T_RangeTblEntry
- 再次将类型强转成RangeTblEntry,并打印 p ((RangeTblEntry
*)result->rtable[0]->elements[0])[0] ,就会输出void *实际结构体的内容
之所以可以这么搞是因为parsenodes.h中所有的结构体首地值都是NodeTag type;