使用postgresql在eclipse中的断点

时间:2014-07-06 09:55:44

标签: eclipse postgresql

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

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

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

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

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

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

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

我甚至没有选择该字段" Start on Start up = main " ,但是当我这样做时,步入和跳过按钮未激活,并且弹出以下问题。

无法将主表保存到文件' /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(Permission denied)

所以我使用sudo启动了eclipse,但这次在eclipse的控制台中出现了以下错误。

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

任何人都可以帮助我。

谢谢

2 个答案:

答案 0 :(得分:3)

问题1:用户ID不匹配

在这些行之间进行读取,听起来您正在尝试调试作为postgres用户运行的PostgreSQL实例,或者无论如何都要调试不同的用户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

此:

  

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

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

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

做得对

以下是您需要做的事情 - 粗略概述,因为我只使用Eclipse进行Java开发并使用vim和gdb进行C开发:

  • 编译PostgreSQL的 debug build (使用./configure --enable-debug编译,最好还编译CFLAGS="-ggdb -Og -fno-omit-frame-pointer")。在homedir中指定--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

  • 联系
  • 执行您需要做的任何设置

  • SELECT pg_backend_pid()会话中获取psql后端进程ID。让那个会话开放;这是你要调试的那个。

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

  • 设置任何所需的断点并继续执行

  • psql会话中,执行您需要做的任何事情以使您的扩展程序运行并点击断点

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

基本的误解?

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

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

答案 1 :(得分:0)

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

我在Wiki(https://wiki.postgresql.org/wiki/Working_with_Eclipse)中的“使用子进程进行调试”下误解了以下几点。

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

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

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

启动eclipse中的调试器。