尝试使用gdb调试Apache Age中的错误时出现以下错误。使用pg_ctl
启动postgres服务器,并使用psql
建立与数据库的连接。使用SELECT pg_backend_pid()
命令找到psql的运行进程ID(pid)。但是,尝试使用gdb --pid 4585
将gdb附加到psql进程时,收到以下错误消息:
Attaching to process 4585
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.
之后,我尝试使用命令sudo gdb --pid 4585
以提升的权限运行gdb,但是显示了以下错误消息:
Starting program: /home/mohayu/Desktop/age_installation/pg/postgresql-11.18/bin/postgres
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent
possible system security compromise. See the documentation for
more information on how to properly start the server.
[Inferior 1 (process 5056) exited with code 01]
如果您不确定错误发生的原因,请告诉我如何使用gdb调试ApacheAge。
3条答案
按热度按时间ej83mcc01#
错误消息表明用户帐户没有足够的权限将gdb附加到目标进程或调试Apache Age进程。这可能是由于系统的安全设置造成的。
以下是一些可能的解决方案:
1.* * 检查ptrace_scope设置**
错误消息提到检查/proc/sys/kernel/yama/ptrace_scope设置。这是一个安全设置,控制使用ptrace()系统调用所需的权限,gdb使用该系统调用附加到正在运行的进程。您可以使用以下命令检查此设置的当前值:
如果输出为"1",则意味着只有与目标进程具有相同用户ID的进程才能使用gdb附加到它。要允许gdb附加到目标进程,可以使用以下命令将ptrace_scope值设置为"0":
但是,请注意,更改此设置可能会影响系统安全性,因此建议不要在生产系统上进行此操作。
1.* * 以非特权用户身份启动服务器**
第二条错误消息建议必须以非特权用户ID启动PostgreSQL服务器以防止安全性受损。您可以创建一个具有受限权限的新用户帐户并使用该帐户启动服务器,从而以非特权用户身份启动服务器。以下是基本步骤:
一旦在非特权用户帐户下启动服务器,就可以使用同一帐户将gdb附加到进程。
1.* * 使用调试器友好的版本**
请确保在配置PostgreSQL时启用调试符号。您可以使用以下命令重新配置:
您还可以参考PostgreSQL document,以获取有关如何构建调试器友好版本的更多信息。
在使用GDB进行调试方面,使用
ps -C postgres
找到要调试的会话的进程,然后执行命令gdb -p
。基本的GDB命令有:
我发现this post展示了一个调试进程的示例,这应该是一个很好的参考。
xqnpmsa82#
请参考这个post。您需要禁用一个阻止GDB对非子进程进行ptracing的限制。
mqkwyuun3#
当您是拥有PostgreSQL进程的用户时运行
gdb
,通常是postgres
。确保安装了PostgreSQL调试符号,并且扩展是使用
-g
或-ggdb
构建的。