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

问题描述 投票:0回答:3

尝试使用 gdb 调试 Apache Age 中的错误时出现以下错误。 postgres 服务器使用

pg_ctl
启动,并使用
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 调试 Apache Age。

postgresql gdb apache-age
3个回答
1
投票

当您是拥有 PostgreSQL 进程的用户时运行

gdb
,通常是
postgres

确保您安装了 PostgreSQL 调试符号,并且扩展是使用

-g
-ggdb
构建的。


0
投票

使用第一种方法,使用

gdb --pid 4585
,我遇到了同样的错误。虽然在使用
sudo
的第二种方法中我成功了,但我还有另一个建议:

首先,尝试使用

sudo gdb
命令。系统必须返回以下内容:

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)

然后,使用

attach [ID]
命令将
[ID]
替换为 pid。如果成功,终端将返回类似以下消息:

Reading symbols from /usr/local/pgsql-12/bin/postgres...
Reading symbols from /lib/x86_64-linux-gnu/libpthread.so.0...
Reading symbols from /usr/lib/debug/.build-id/7b/4536f41cdaa5888408e82d0836e33dcf436466.debug...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
Reading symbols from /usr/lib/debug/.build-id/ce/016c975d94bc4770ed8c62d45dea6b71405a2c.debug...
Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2...
Reading symbols from /usr/lib/debug/.build-id/c0/f40155b3f8bf8c494fa800f9ab197ebe20ed6e.debug...
Reading symbols from /lib/x86_64-linux-gnu/libm.so.6...
Reading symbols from /usr/lib/debug/.build-id/fe/91b4090ea04c1559ff71dd9290062776618891.debug...
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...
Reading symbols from /usr/lib/debug/.build-id/18/78e6b475720c7c51969e69ab2d276fae6d1dee.debug...
Reading symbols from /lib64/ld-linux-x86-64.so.2...
Reading symbols from /usr/lib/debug/.build-id/45/87364908de169dec62ffa538170118c1c3a078.debug...
Reading symbols from /lib/x86_64-linux-gnu/libnss_files.so.2...
--Type <RET> for more, q to quit, c to continue without paging--

0
投票

对于仍然面临问题(在 Linux 上)的任何人,他们可以尝试使用以下命令获取进程 ID,并检查这是否适用于他们

ps auxwww | grep postgres | grep -v grep

确保扩展是使用调试标志进行编译的,并且也已加载到会话中。

© www.soinside.com 2019 - 2024. All rights reserved.