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出现故障的紧密循环中旋转令人费解......
有些 PID 未列出,因为它们属于线程。如果您按(也可以选择树视图)htop可以显示它们,但需要主进程的 PID。(无论如何,进程中的所有 pthread 都共享文件描述符。)您还可以查看和。Shift+HTlsof/proc/5546/fd//proc/5546/task/
EAGAIN 对于非阻塞 I/O 是正常的;read()例如,当没有数据可供读取时返回。请参阅read(2)、write(2)等中的“错误” 。其中一些 fd 可能是到 X11 服务器的连接 \xe2\x80\x93 非阻塞 I/O 由 X11 客户端库使用。