【问题标题】: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

调试器在服务器上工作正常(等待并接受传入的客户端连接)。

  1. 当我连接客户端时:$ psql test。服务器是否为客户端创建新线程?

  2. 是否可以在 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-modedetach-on-forkschedule-multiplenon-stop 选项的 gdb 的多进程调试功能,但要正确操作很复杂,嘈杂,如果您习惯了 gdb 的正常中断行为,您会感到困惑。这也有点尴尬,因为 PostgreSQL 使用 gdb 也使用的信号,所以需要一些技巧来解决这个问题。见a blog post I wrote on the topic earlier

    我建议保持简单并使用pg_backend_pid 附加。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2013-11-20
      • 2013-04-01
      • 2013-01-18
      • 2013-12-23
      • 2012-02-18
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      相关资源
      最近更新 更多