Suche Debughilfe: child never returns from fork?

From: Peter Much <pmc(at)citylink.dinoex.sub.org>
Date: Mon, 7 Apr 2008 20:03:24 GMT

Moin Leute,

  ich hab hier ein ziemlich widerliches Problem.

Der Code sieht so aus:

> switch (bpipe->worker_pid = fork()) {
> case -1: /* error */
 ... etc. etc. ...
> case 0: /* child */
> close(readp[0]); /* Close unused child fds */
> dup2(readp[1], 1); /* dup our read to his stdout */
> dup2(readp[1], 2); /* and his stderr */
 ... etc. etc. und irgendwann dann execvp()
> default: /* parent */
> break;
> }
 ... etc. etc. ...

Passieren tut dabei folgendes:
 - der fork() wird ausgeführt, ich hab also zweimal dasselbe Programm
   mit unterschiedlicher PID in der Prozessliste.
 - der Parent läuft normal weiter und macht seine Arbeit wie
   vorgesehen.
 - das Child steht im Status "Running" und braucht 100% system-cpu,
   und ist dementsprechend nur mit -9 killbar.
 - wenn ich mit lsof die Filehandles anschaue, dann sehe ich dass
   der close() noch nicht ausgeführt wurde.

Jetzt kommt die Widerlichkeit: das Zeug läuft 500 mal korrekt ab, und
dann bleibt es -unvorhersagbar- irgendwann einmal hängen. Aber das auch
immer wieder mal - d.h. alle paar Tage. Und auf einer anderen,
installationsgleichen aber deutlich schnelleren (und weniger
vollgepackten) Maschine ist es nur einmal passiert.

Der Fehler ist plötzlich aufgetaucht nachdem die Maschinen auf
RELEASE 6.3 upgraded wurden (zuvor: RELEASE 5.5, mit identischen
Ports).

Ich kann natürlich nicht sagen, ob der Prozess aus dem fork() nicht
raus- oder in den close() nicht reinkommt. Mir ist auch klar, dass
der fork() derweil milliardenmal richtig ausgeführt wird...
Wie kann man sowas debuggen?

PMc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 07 Apr 2008 - 23:13:09 CEST

search this site