我正在使用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下启动服务器以防止 可能的系统安全妥协。请参阅文档 有关如何正确启动服务器的更多信息。
任何人都可以帮助我。
谢谢
答案 0 :(得分:3)
在这些行之间进行读取,听起来您正在尝试调试作为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。
此:
不允许执行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中的调试器。