【问题标题】:Debugging Postgresql 9.3 with Eclipse CDT and GDB使用 Eclipse CDT 和 GDB 调试 Postgresql 9.3
【发布时间】:2015-11-12 12:10:32
【问题描述】:
我是java背景,在eclipse(java)中使用过调试器。
我已经安装了 postgresql 9.3,如以下链接所述:https://wiki.postgresql.org/wiki/Working_with_Eclipse
调试器在服务器上工作正常(等待并接受传入的客户端连接)。
当我连接客户端时:$ psql test。服务器是否为客户端创建新线程?
是否可以在 postgresql 源文件的 parser.c 或 executor.c 中附加调试器并设置断点,以便我可以分析 postgresql 查询是如何执行的?
我尝试在 parser.c 中附加调试器并设置断点,并在客户端执行了一些查询。但它并没有在断点处停止。
提前致谢
【问题讨论】:
标签:
c
eclipse
postgresql
debugging
【解决方案1】:
当我连接客户端时:$ psql test,服务器是否为客户端创建一个新线程?
没有。服务器创建一个新的postgres(或在Windows 上为postgres.exe)进程,它通过共享内存和信号与邮局主管和其他进程进行通信。 PostgreSQL 使用默认不共享的多处理架构,而不是默认共享所有内容的多线程架构。
是否可以在 postgresql 源文件的 parser.c 或 executor.c 中附加调试器并设置断点,以便我可以分析 postgresql 查询是如何执行的?
是的,如果您的调试器可以跟随来自 postmaster 的后端分支,或者如果您直接将调试器附加到您希望调试的后端。后者更常见,除非您正在调试后端启动。
典型的工作流程是:
- 联系
psql
SELECT pg_backend_pid()
- 将调试器连接到该进程 ID
- 根据需要设置断点和监视并恢复执行
- 在同一个
psql 会话中,运行要调试后端执行的查询
- 当出现陷阱并开始调试时切换到调试器
这适用于带有 gdb 的 Linux 和带有 Visual Studio 的 Windows。大概它也适用于 Eclipse。
更多信息请访问the developer FAQ。
可能改为调试 postmaster 并使用带有 follow-fork-mode、detach-on-fork、schedule-multiple 和 non-stop 选项的 gdb 的多进程调试功能,但要正确操作很复杂,嘈杂,如果您习惯了 gdb 的正常中断行为,您会感到困惑。这也有点尴尬,因为 PostgreSQL 使用 gdb 也使用的信号,所以需要一些技巧来解决这个问题。见a blog post I wrote on the topic earlier。
我建议保持简单并使用pg_backend_pid 附加。