web-dev-qa-db-ja.com

straceを使用して接続タイムアウトをデバッグしますか?

Eclipseが回転している理由を理解しようとしているので、straceを起動することにしました。

私はEclipseプロセスを使用して見つけました:

_$ ps ax | grep Java
 5546 ?        Sl    19:04 /usr/bin/Java ... [arguments omitted]
_

このプロセスでstraceを実行すると、別のプロセスを待機していることがわかります。

_$ Sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached
_

興味深いことに、プロセス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)
...
_

出力から判断すると、ファイル記述子16、15、68、128、および69をポーリングしているように見えます。特にEAGAINエラーは、read(2)およびrecvfrom(2)呼び出し。

これらのfdsに関する詳細情報を見つけるにはどうすればよいですか? _lsof -p 5547_を試しましたが、出力が出力されません。これらはいくつかのウェブサイトに公開されているソケットだと思いますが、EAGAINの失敗でタイトなループで回転している理由は不可解です...

6
jabalsad

一部のPIDは、threadsに属しているため、リストされていません。 htopを押すと、それらを表示できます Shift+H (およびオプションで T ツリービューの場合)、ただしlsofはメインプロセスのPIDを必要とします。 (とにかく、プロセス内のすべてのpthreadはファイル記述子を共有します。)_/proc/5546/fd/_および_/proc/5546/task/_も確認できます。

EAGAINは、非ブロッキングI/Oでは正常です。たとえば、読み取るデータがない場合はread()によって返されます。 read(2)write(2)などの「エラー」を参照してください。これらのfdの一部は、X11サーバーへの接続である可能性があります。非ブロッキングI/OはX11クライアントライブラリによって使用されます。

3
user1686

futex(2)の3番目のパラメータは必ずしもプロセスIDである必要はなく、マニュアルにはfutex(uaddr, op, val, timeout, ...)と記載されており、opがFUTEX_WAITの場合、「futexアドレスを原子的に検証します- addrにはまだ値valが含まれており、このfutexアドレスでFUTEX_WAKEを待機してスリープします。[When] timeoutがNULLの場合、呼び出しは無期限にブロックされます。」

あなたの場合、プロセス5546がそこに座って何か(おそらくスレッド5547または関連するもの)を待っていたようですが、これだけに基づいて正確に何を確認するかはわかりませんが、指定されたメモリにその番号を書き込みます住所。

ps -eLfなどを使用してスレッドを表示できることにも注意してください。

2
Josip Rodin