我有一个简单的C程序,它会分叉一个进程,然后运行一个可执行文件.
我想将子进程附加到gdb.
我在控制台中运行主程序并打开另一个控制台以查找子进程的pid,然后使用以下命令启动gdb:
gdb attach 12271
Run Code Online (Sandbox Code Playgroud)
12271子进程ID 在哪里,但附加失败:
No such file or directory.
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我正在尝试使用gdb附加程序,但它返回给我:
附加到进程29139无法附加到进程.如果您的uid与目标进程的uid匹配,请检查/ proc/sys/kernel/yama/ptrace_scope的设置,或以root用户身份再次尝试.有关更多详细信息,请参阅/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作.
edb-debugger返回"无法附加到进程,请检查权限,然后重试."
strace返回"attach:ptrace(PTRACE_ATTACH,...):不允许操作"
我将"kernel.yama.ptrace_scope"1更改为0并将"/ proc/sys/kernel/yama/ptrace_scope"1更改为0并尝试使用以下方法设置"set environment LD_PRELOAD =./ ptrace.so":
#include <stdio.h>
int ptrace(int i, int j, int k, int l) {
printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它仍然返回相同的错误.我如何将它附加到调试器?
我正在为我的一个应用程序使用Postgres,有时(不是非常频繁)其中一个连接进入<IDLE> in transaction状态并且它保持获取的锁定,导致其他连接等待这些锁,最终导致我的应用程序挂起.
以下是该pg_stat_activity流程的表输出:
select * from pg_stat_activity
24081 | db | 798 | 16384 | db | | 10.112.61.218 | | 59034 | 2013-09-12 23:46:05.132267+00 | 2013-09-12 23:47:31.763084+00 | 2013-09-12 23:47:31.763534+00 | f | <IDLE> in transaction
Run Code Online (Sandbox Code Playgroud)
这表明PID=798处于<IDLE> in transaction状态.使用上面输出中的client_port(59034),可以在Web服务器上找到客户端进程.
sudo netstat -apl | grep 59034
tcp 0 0 ip-10-112-61-218.:59034 db-server:postgresql ESTABLISHED 23843/pgbouncer
Run Code Online (Sandbox Code Playgroud)
我知道我的应用程序代码(我杀了一个运行的应用程序cron并释放了锁)导致连接挂起,但是我无法跟踪它.
这不是很频繁,我找不到任何明确的复制步骤,因为这只发生在生产服务器上.
我想得到关于如何跟踪这种空闲连接的输入,例如获取最后执行的查询或某种跟踪以确定哪个部分的代码导致了这个问题.