【问题标题】:breakpoints in eclipse using postgresqleclipse中的断点使用postgresql
【发布时间】:2018-12-24 03:31:11
【问题描述】:

我正在使用 helios Eclipse 在 postgresql 中调试我的代码。

我的目的是了解postgresql在join查询过程中是如何使用join算法的,所以我开始调试Executor文件夹中的nodenestloop.c

我在该文件中给出了断点,但是每当我尝试调试该文件时,控件都会转到 main.c 并且永远不会返回,我如何将控件仅限制到该特定文件(nodeestloop.c)

以下是我在 Helios Eclipse 的 Debug 配置中给出的以下字段。

C/C++ 应用程序 - src/backend/postgres项目 - pgsql

我按照以下链接中给出的步骤运行程序。

https://wiki.postgresql.org/wiki/Working_with_Eclipse#

我什至取消了 "Start on Start up=main" 字段,但是当我这样做时,step in 和 Step over 按钮未激活,并且以下问题出现了。

无法将主表保存到文件“/home/ravi/workspace/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources”。 /home/ravi/workspace/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources(权限被拒绝)

于是我用sudo启动了eclipse,但是这次eclipse的控制台出现了如下错误。

不允许 PostgreSQL 服务器的“root”执行。 必须在非特权用户 ID 下启动服务器以防止 可能的系统安全妥协。请参阅文档 有关如何正确启动服务器的更多信息。

谁能帮帮我。

谢谢

【问题讨论】:

标签: eclipse postgresql


【解决方案1】:

问题 1:用户 ID 不匹配

从字里行间看,听起来您正在尝试调试以 postgres 用户身份运行的 PostgreSQL 实例,或者与您自己的用户 ID 不同的用户 ID。因此,您尝试使用sudo

这很痛苦,尤其是在使用像 Eclipse 这样的 IDE 时。使用普通的gdb,您只需sudo 将gdb 命令设置为所需的uid,例如sudo -u postgres -p 12345 附加到以用户 postgres 运行的 pid 12345。这不适用于 Eclipse。事实上,使用sudo 运行它可能会使您的工作区留下一些混乱的文件权限;运行:

sudo chown -R ravi /home/ravi/workspace/

修复文件所有权。

如果您想使用 Eclipse 调试其他用户 ID 下的进程,您需要弄清楚如何使用 sudo 使 Eclipse 运行 gdb不要只用sudo 运行所有的Eclipse。

问题2:试图在Eclipse的控制下运行PostgreSQL

这个:

不允许“root”执行 PostgreSQL 服务器。必须在非特权用户 ID 下启动服务器,以防止可能的系统安全受损。有关如何正确启动服务器的更多信息,请参阅文档。

建议您也尝试让 Eclipse 直接启动 postgres。如果您尝试调试 postmaster,这将非常有用,但是由于您正在谈论查询计划器,因此很明显您想要调试特定的后端。在 Eclipse 下启动 postmaster 是没有用的,你会被附加到错误的进程。

我认为您可能需要阅读有关 PostgreSQL 内部的文档:

做对了

这是你需要做的——粗略的概述,因为我只使用 Eclipse 进行 Java 开发,并使用 vim 和 gdb 进行 C 开发:

  • 编译 PostgreSQL 的调试版本(使用./configure --enable-debug 编译,最好还使用CFLAGS="-ggdb -Og -fno-omit-frame-pointer")。在您的主目录中指定 --prefix,例如 --prefix=$HOME/postgres-debug

  • 首先将调试版本的bin 目录放在PATH 上,例如export PATH=$HOME/postgres-debug/bin:$PATH

  • initdb -U postgres -D $HOME/postgres-debug-data 来自调试版本的新 PostgreSQL 实例

  • PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start启动新实例

  • 联系PGPORT=5599 psql postgres

  • 做任何你需要做的设置

  • psql 会话中使用SELECT pg_backend_pid() 获取后端进程ID。让该会话保持打开状态;这是你要调试的那个。

  • 使用包含您正在调试的 PostgreSQL 扩展源代码的 Eclipse 项目,将 Eclipse 的调试器附加到该进程 ID。确保已配置 Eclipse,以便它也可以找到您编译时使用的 PostgreSQL 源代码(不知道怎么做,请参阅手册)。

  • 设置任何所需的断点并恢复执行

  • psql 会话中,做任何你需要做的事情来让你的扩展运行并命中断点

  • 当执行在 Eclipse 中的断点处暂停时,根据需要进行调试。

基本误解?

另外,如果您真的对这一切的工作原理感到困惑:PostgreSQL 是一个客户端/服务器应用程序。如果您尝试调试使用 libpq 或 odbc 的 客户端程序,并希望在某些 PostgreSQL 后端扩展代码中触发断点,则不会发生这种情况。客户端应用程序通过 TCP/IP 套接字与 PostgreSQL 通信。这是一个单独的程序。 gdb 在连接到客户端时无法在 PostgreSQL 服务器中设置断点,因为它们是单独的程序。如果要调试服务器,则必须将 gdb 附加到服务器。 PostgreSQL 每个连接使用一个进程,因此您必须将 gdb 附加到 正确 服务器进程。这就是为什么我在上面说使用SELECT pg_backend_pid(),并附加到进程ID。

请参阅上面链接的内部文档,并且:

【讨论】:

    【解决方案2】:

    我也遇到过类似的问题,经过一番努力解决了

    我误解了 Wiki 中的 Debugging with child processes (https://wiki.postgresql.org/wiki/Working_with_Eclipse) 下的以下几点。

    5.“启动 postmaster 和一瞬间的 postgresql 客户端(用于创建一个新的 postgres)”

    上述步骤应通过启动 postgres 服务器和一个客户端从终端执行。

    希望这会有所帮助 完成此操作后,需要为 C/C++ 附加到应用程序

    启动 eclipse 中的调试器

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2011-06-11
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多