如何使用gdb调试greenplum

时间:2019-05-14 01:59:23

标签: multithreading postgresql gdb distributed greenplum

我需要使用gdb调试PostgreSQL数据库的分布式版本greenplum。现在,我已经成功安装了greenplum并能够使用psql运行sql。但是,当我使用gdb调试它时,很难获得代码跟踪。它经常报告“没有这样的文件”。我没有在线找到有用的文件。有没有相关经验?谢谢。

对于greenplum数据库,我有一个主节点和两个段节点。

在终端A中,我首先在主节点上使用pg_backend_pid()获取后端线程ID。

[testDB=# select pg_backend_pid();
pg_backend_pid 
----------------
           9893
(1 row)

然后在另一个终端B中,我使用gdb附加到后端进程:

gpadmin@greenplum-mdw:/home/build/gpdb$ sudo gdb -p 9893

我可以通过“ info thre”查看线程信息:

(gdb) info thre
  Id   Target Id                                   Frame 
* 1    Thread 0x7fe0a51a7740 (LWP 9893) "postgres" 0x00007fe0a24d587f in __libc_recv (fd=11, buf=buf@entry=0x102db80 <PqRecvBuffer>, n=n@entry=8192, flags=flags@entry=0)
    at ../sysdeps/unix/sysv/linux/x86_64/recv.c:28
  2    Thread 0x7fe08cee7700 (LWP 9894) "postgres" 0x00007fe0a194974d in poll () at ../sysdeps/unix/syscall-template.S:84

在终端A中,我通过psql接口运行一个sql:

[testDB=# select count(*) from customers;

在终端B中,我逐步运行程序,但没有显示类似这样的文件或目录:

(gdb) n
29  ../sysdeps/unix/sysv/linux/x86_64/recv.c: No such file or directory.

还有这个

(gdb) n
pq_recvbuf () at pqcomm.c:925
925 pqcomm.c: No such file or directory.

我想看一下函数PostgresMain,所以我做了:

(gdb) b PostgresMain
Note: breakpoint 1 also set at pc 0x87c860.
Breakpoint 2 at 0x87c860: file postgres.c, line 4590.

但是在我跑步之后,继续这样:

(gdb) c
Continuing.

它永远不会停止。

1 个答案:

答案 0 :(得分:0)

我最终发现greenplum在编译时没有添加-g和-ggdb标志。我添加了它,然后它起作用了。