PostgreSQL/Greenplum源码调试

在修改greenplum的源码时,有时需要调试,比如查看源码中某个变量的值或查看函数的完整执行过程。下面记录常用的调试方式。

输出调试信息

elog(DEBUG1, "call hash_create");
elog(DEBUG1, "call hash_search_with_hash_value -> HASH_FIND");
elog(ERROR, "cannot freeze shared hashtable \"%s\"", hashp->tabname);

设置session级别的日志

testDB=# set log_min_messages=debug1;

输出错误报告

PostgreSQL中所使用的所有错误报告和通道外消息均借助宏 ereport(<errorlevel>,rest)来实现。
错误级别 FATAL 将清理后端并退出当前会话。
PANIC 是最具破坏性的一个错误级别,它不仅将结束当前连接,并且它会终止所有其他的连接。PANIC意味着共享状态(共享内存)可能被损坏,不能安全继续。
WARNING 是最高的非错误级别。这意味着部分内容可能是错误的,需要用户/管理员的注意。警告会默认传给客户端或被写入服务器日志。
NOTICE 是那些用户可能较感兴趣的内容,例如主键索引或者串行类型的顺序的创建信息。NOTICE也会默认传给客户端或写入服务器日志。
INFO 被专门用于响应客户端的需求,如VACCUM/ANALYZE VERBOSE。它总是被发送到客户端,忽略 client_min_messages GUC 的配置,但使用默认设置时,它不会被写入服务器日志。
LOG(与 COMMEROR) 是为了响应服务器的运行消息,并且在默认情况下是仅被写入服务器日志。如果正确设置 client_min_messages,错误级别 LOG 也可以发送给客户端,但是 COMMERROR 无法发送给客户端。
同时也有递增顺序的 DEBUG1 到 DEBUG5,它们被专门用来汇报调试信息,但在大多数情况下它们并不那么实用。在生产服务器上,我们并不建议设置较高的 DEBUGx 级别,因为要记录的或者要报告的数量实在太多。

ereport(INFO,(errmsg("got invalid segno value NULL for tid %d",10)));
//或
ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT),
                        errmsg("AOCS table \"%s\" file segment \"%d\" does not exist",
                               RelationGetRelationName(prel), segno)

记录日志

修改 postgresql.conf  文件,在文件中添加

debug_print_parse = true
debug_print_rewritten = true
debug_print_plan = true

上述选项打开各种调试输出,当设置时,它们打印生成的解析树,查询重写输出,或每个执行查询的执行计划。这些消息在LOG消息级别,所以默认情况下它们会出现在服务器日志中,但不会被发送到客户端。可以通过调整client_min_messages或/和 log_min_messages改变。这些参数缺省都是关闭的。

Greenplum源码编译安装 
18.8. 错误报告和日志​ 
50.2. 报告服务器里的错误​ 
GDB调试 

常用代码

判断是否是主节点

if (Gp_role == GP_ROLE_DISPATCH)  //判断是否查询计划生成节点
if (Gp_role == GP_ROLE_EXECUTE)  //判断是否执行节点