postgresql 无法使用GDB调试器附加正在运行的进程

axr492tv  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(3)|浏览(305)

尝试使用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。

ej83mcc0

ej83mcc01#

错误消息表明用户帐户没有足够的权限将gdb附加到目标进程或调试Apache Age进程。这可能是由于系统的安全设置造成的。
以下是一些可能的解决方案:
1.* * 检查ptrace_scope设置**
错误消息提到检查/proc/sys/kernel/yama/ptrace_scope设置。这是一个安全设置,控制使用ptrace()系统调用所需的权限,gdb使用该系统调用附加到正在运行的进程。您可以使用以下命令检查此设置的当前值:

cat /proc/sys/kernel/yama/ptrace_scope

如果输出为"1",则意味着只有与目标进程具有相同用户ID的进程才能使用gdb附加到它。要允许gdb附加到目标进程,可以使用以下命令将ptrace_scope值设置为"0":

sudo sysctl kernel.yama.ptrace_scope=0

但是,请注意,更改此设置可能会影响系统安全性,因此建议不要在生产系统上进行此操作。
1.* * 以非特权用户身份启动服务器**
第二条错误消息建议必须以非特权用户ID启动PostgreSQL服务器以防止安全性受损。您可以创建一个具有受限权限的新用户帐户并使用该帐户启动服务器,从而以非特权用户身份启动服务器。以下是基本步骤:

# Create a new user account
sudo useradd --system --shell /bin/false postgres

# Set the ownership of the PostgreSQL data directory
sudo chown -R postgres:postgres /path/to/data/directory

# Start the server using the new user account
sudo -u postgres /path/to/postgresql/bin/postgres -D /path/to/data/directory

一旦在非特权用户帐户下启动服务器,就可以使用同一帐户将gdb附加到进程。
1.* * 使用调试器友好的版本**
请确保在配置PostgreSQL时启用调试符号。您可以使用以下命令重新配置:

./configure --enable-debug --enable-cassert --prefix=$(pwd) CFLAGS="-ggdb -Og -fno-omit-frame-pointer"

您还可以参考PostgreSQL document,以获取有关如何构建调试器友好版本的更多信息。
在使用GDB进行调试方面,使用ps -C postgres找到要调试的会话的进程,然后执行命令gdb -p
基本的GDB命令有:

  • b表示断点,(b)<function_name>)
  • c表示继续-继续到下一个断点
  • n表示下一行
  • s表示步入
  • p表示打印,(p *)表示指针
  • d表示删除所有断点
  • q表示退出

我发现this post展示了一个调试进程的示例,这应该是一个很好的参考。

xqnpmsa8

xqnpmsa82#

请参考这个post。您需要禁用一个阻止GDB对非子进程进行ptracing的限制。

mqkwyuun

mqkwyuun3#

当您是拥有PostgreSQL进程的用户时运行gdb,通常是postgres
确保安装了PostgreSQL调试符号,并且扩展是使用-g-ggdb构建的。

相关问题