使用strace调试连接超时?

jab*_*sad 6 linux eclipse debug strace lsof

我试图弄清楚为什么 Eclipse 会旋转,所以我决定启动 strace。

我使用以下方法找到了 eclipse 过程:

$ ps ax | grep java
 5546 ?        Sl    19:04 /usr/bin/java ... [arguments omitted]
Run Code Online (Sandbox Code Playgroud)

通过strace在这个进程上运行,我看到它正在等待另一个进程:

$ sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached
Run Code Online (Sandbox Code Playgroud)

有趣的是,进程 5547 没有出现在ps(谁能告诉我为什么?),但我可以strace。它反复吐出很多 EAGAIN 失败(偶尔成功)

read(16, 0x7f6c41664d10, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0
poll([{fd=16, events=POLLIN}, {fd=15, events=POLLIN}, {fd=68, events=POLLIN}, {fd=128, events=POLLIN}, {fd=69, events=POLLIN}], 5, 0) = 0 (Timeout)
read(16, 0x7f6c41664cb0, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
...
Run Code Online (Sandbox Code Playgroud)

从输出来看,它看起来像是在轮询文件描述符 16、15、68、128 和 69。特别是,EAGAIN错误来自 fds 15 和 6,从read(2)recvfrom(2)调用中可以看出。

我如何找到有关这些 fd 的更多信息?我试过了,lsof -p 5547但没有打印输出。我怀疑这些是对某些网站开放的套接字,但是为什么它在EAGAIN出现故障的紧密循环中旋转令人费解......

use*_*686 3

有些 PID 未列出,因为它们属于线程。如果您按(也可以选择树视图)htop可以显示它们,但需要主进程的 PID。(无论如何,进程中的所有 pthread 都共享文件描述符。)您还可以查看和。Shift+HTlsof/proc/5546/fd//proc/5546/task/

\n\n

EAGAIN 对于非阻塞 I/O 是正常的;read()例如,当没有数据可供读取时返回。请参阅read(2)write(2)等中的“错误” 。其中一些 fd 可能是到 X11 服务器的连接 \xe2\x80\x93 非阻塞 I/O 由 X11 客户端库使用。

\n