Debuggen von Verbindungs-Timeouts mit strace?

17072
jabalsad

Ich versuche herauszufinden, warum sich Eclipse dreht, also beschloss ich, die Straße hochzufahren.

Ich fand den Eclipse-Prozess mit:

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

Wenn Sie stracediesen Prozess ausführen, sehe ich, dass er auf einen anderen Prozess wartet:

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

Interessanterweise erscheint der Prozess 5547 nicht in ps(kann mir jemand sagen, warum?), Aber ich kann stracees. Es werden immer wieder viele EAGAIN-Ausfälle ausgespuckt (mit gelegentlichem Erfolg)

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, ) = 0 poll([,, ,, ], 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) ... 

Aus der Ausgabe zu urteilen, sieht es so aus, als würden die Dateideskriptoren 16, 15, 68, 128 und 69 abgefragt. Insbesondere die EAGAINFehler kommen von den fds 15 und 6, wie aus den Aufrufen read(2)und hervorgeht recvfrom(2).

Wie finde ich weitere Informationen zu diesen FDS? Ich habe es versucht, lsof -p 5547aber es wird keine Ausgabe gedruckt. Ich vermute, dies sind Steckdosen, die für manche Website offen sind, aber warum es sich mit EAGAINFehlern in einer engen Schleife dreht, ist rätselhaft ...

4

2 Antworten auf die Frage

2
grawity

Einige PIDs werden nicht aufgelistet, da sie zu Threads gehören . htopkann sie anzeigen, wenn Sie Shift+H(und optional Tfür die Baumansicht) drücken, lsofdie PID des Hauptprozesses jedoch gewünscht wird. (Alle Pthreads in einem Prozess teilen Dateideskriptoren trotzdem.) Sie können auch in /proc/5546/fd/und schauen /proc/5546/task/.

EAGAIN ist normal für nicht blockierende E / A. Es wird beispielsweise zurückgegeben, read()wenn keine Daten zum Lesen vorhanden sind. Siehe "FEHLER" in Lesen (2), Schreiben (2) usw. Einige dieser FDs sind wahrscheinlich Verbindungen zum X11-Server. Nicht blockierende E / A werden von den X11-Client-Bibliotheken verwendet.

Danke, ich bin jetzt ein bisschen besser im Debugging :-) jabalsad vor 11 Jahren 0
Wäre es nicht weniger ressourcenintensiv, wenn die Sockets Rückrufe verwenden, um zu wissen, wann Daten eingetroffen sind? jabalsad vor 11 Jahren 0
@jabalsad: `poll ()` wird dafür bereits verwendet. Ich weiß jedoch nicht, warum es zurückgibt, wenn nichts zu lesen ist (). grawity vor 11 Jahren 0
Meinen Sie damit, dass die Anwendung beim Aufruf von "poll ()" wissen muss, dass Daten zum Lesen verfügbar sind oder nicht? Wenn ja, warum wird ein `read ()` trotzdem ausgeführt, wenn keine Daten verfügbar sind? jabalsad vor 11 Jahren 0
Nevermind, dein hinzugefügter Kommentar hat meine Frage beantwortet. jabalsad vor 11 Jahren 0
@jabalsad: Ah, ich habe gerade ein paar Dinge bemerkt. Zum einen sind die in der strace-Ausgabe angezeigten fds tatsächlich * input * für poll (), nicht ihre Ausgabe (wie dies bei select () der Fall wäre), so dass strace natürlich alle abgefragten fds zeigt. Zweitens gibt "poll ()" 0 zurück, was "Zeitüberschreitung, keine Ereignisse" bedeutet. Die fds haben also wirklich keine neuen Daten. Die Bibliothek kann den Rückkehrcode wahrscheinlich nicht richtig überprüfen. grawity vor 11 Jahren 0
2
Josip Rodin

Der dritte Parameter von futex(2)ist nicht notwendigerweise eine Prozess-ID, das Handbuch sagt futex(uaddr, op, val, timeout, ...), dass es ist, und wenn op ist FUTEX_WAIT, wird atomar überprüft, ob die Futex-Adresse uaddr noch den Wert val enthält, und schläft, bis FUTEX_WAKE auf diese Futex-Adresse wartet. [When] timeout ist NULL, der Aufruf wird unbegrenzt blockiert. "

In Ihrem Fall hört sich der Prozess an, als ob der Prozess 5546 dort gewartet hätte, wahrscheinlich auf seinen Thread 5547 oder etwas Ähnliches, aber wir können nicht genau wissen, was genau darauf basiert, diese Zahl in den angegebenen Speicher zu schreiben Adresse.

Beachten Sie auch, dass Sie Threads mithilfe von ps -eLfoder ähnlich anzeigen können .