继“如何将 strace 附加到不在 ps 输出中的进程? ”中描述的问题之后。
我正在尝试调试一个中途挂起的进程。
通过strace -f
在我的父进程上使用,我能够确定我有一堆正在显示的线程:
# strace -p 26334
Process 26334 attached - interrupt to quit
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, {}, 4096, 500) = 0
epoll_wait(607, ^C <unfinished ...>
Process 26334 detached
Run Code Online (Sandbox Code Playgroud)
进一步调查:
# readlink /proc/26334/fd/607
anon_inode:[eventpoll]
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,我已经设法让一些线程处于死锁状态,但我epoll
对继续前进的了解还不够多。是否有任何命令可以让我深入了解这些线程正在轮询什么,或者这个 epoll 描述符映射到哪些文件描述符。
当您运行strace
这些行时,它返回的是系统函数。万一它不明显epoll_wait()
是一个函数,你可以做一个man epoll_wait
来找出实现细节,如下所示:
epoll_wait, epoll_pwait - wait for an I/O event on an epoll file descriptor
Run Code Online (Sandbox Code Playgroud)
的描述epoll
:
epoll API 执行与 poll(2) 类似的任务:监视多个文件描述符以查看是否可以在其中任何一个上进行 I/O。epoll API 可以用作边缘触发或级别触发的接口,并且可以很好地扩展到大量监视的文件描述符。
因此,您的进程似乎在文件描述符上阻塞,等待查看是否可以在其中任何一个上进行 I/O。
我会稍微改变一下我的策略并尝试利用lsof -p <pid>
看看你是否可以缩小这些文件的实际范围。