我可以找到关于正在运行的线程上的事件轮询的哪些信息?

Dan*_*umb 9 process thread

继“如何将 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 描述符映射到哪些文件描述符。

slm*_*slm 6

当您运行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>看看你是否可以缩小这些文件的实际范围。