2013-02-28 6 views
22

Ich entwickle eine Anwendung, die die Eltern gibt ein Kind, um bestimmte Aufgaben zu behandeln. Ich habe ein Problem, wo ich gdb zu Follow-Fork-Modus Kind konfiguriert habe, aber nach Gabel, nach Erreichen eines Haltepunkts, sendet es ein SIGTRAP, aber das Kind irgendwie beendet und SIGCHLD an den Eltern senden.gdb debugging Kindprozess nach der Gabel (follow-fork-mode Kind konfiguriert)

Ich habe signal(SIGTRAP, SIG_IGN) vor fork konfiguriert, so dass mein Verständnis ist, dass das Kind SIGTRAP erben und ignorieren sollte, wenn der Haltepunkt erreicht wird, aber es passiert nicht.

Bitte helfen Sie mir zu verstehen, wenn ich falsch bin.

Wie kann ich den untergeordneten Prozess erfolgreich debuggen?

+2

„* ... nach einem Haltepunkt erreicht, sendet sie ein SIGTRAP ... *“ das ist die Art und Weise des Debugger über den Haltepunkt mitgeteilt wird. "... das Kind endet irgendwie ... *" endet normal oder abnorm? Sie können 'WIFEXITED (Status)' für den Wert verwenden, der von 'wait [...] ([...,] & status [, ...])' im übergeordneten Element zurückgegeben wird, um dies zu überprüfen. Siehe 'man 3 wait' für Details. – alk

Antwort

59

Der untergeordnete Prozess erbt Signalhandler vom übergeordneten, aber nicht das anstehende Signal.

Nach dem Abzweigen versuchen Sie, den Signalhandler für SIGTRAP an einer Stelle im Code zu installieren, an der der untergeordnete Prozess nach dem Abzweigen ausgeführt wird. Wenn Sie SIGTRAP nicht behandeln, ist die Standardaktion, dass das unterordnete Element beendet wird. Wenn Sie den untergeordneten Prozess debuggen möchten, müssen Sie follow-fork-mode verwenden. Sie müssen den Modus

set follow-fork-mode child 

jedoch mit, jetzt nur noch das Kind debuggt werden können, und die Eltern läuft unkontrolliert.

Es gibt eine andere schmutzige Möglichkeit, den Kindprozess zu debuggen.

Nachdem fork() ausgeführt wurde, setzen Sie einen sleep() Aufruf in den Code, wo das Kind ausgeführt wird, erhalten Sie die PID des Kindes mit dem ps Dienstprogramm, dann fügen Sie die PID.

attach <PID of child process> 

Jetzt können Sie den untergeordneten Prozess wie jeden anderen Prozess debuggen.

Nach Debuggen, können Sie die PID lösen mit

detach