Ich benutze perldb in emacs zum Debuggen von Perl-Skripten (unter Linux). Funktioniert gut, bis ich ein Skript debuggen, das Gabeln. Wenn mein Skript eine "Gabelung" ausführt, bekomme ich Folgendes:
%Vor%Ich würde wirklich gerne in der Lage sein, einen Prozess (entweder den Eltern oder den Kind) zu wählen und weiterhin diesen Prozess zu debuggen, während ich dem anderen erlaube, ungehindert weiterzumachen. Ein Stretch-Ziel wäre eine Möglichkeit, das Debuggen von BOTH-Prozessen eindeutig fortzusetzen, indem möglicherweise zusätzliche Frames in Emacs für Steuerungs- und Codefenster geöffnet werden. Aber in der Lage zu sein, das Debuggen eines von ihnen sauber fortzusetzen, wäre ein großer Gewinn.
Gibt es eine Möglichkeit, dies in perldb zu tun? Ich habe versucht, dem Vorschlag in dieser Nachricht zu folgen, habe aber nichts damit zu tun.
Oder brauche ich ein anderes Perl Debugging Tool? Wenn Letzteres, welcher Perl-Debugger bietet beste Unterstützung für Multi-Prozess-Debugging?
Da es sehr wahrscheinlich ist, dass unter einem xterm oder ähnlichem läuft, werden Sie vielleicht von der ziemlich engen Sicht des Perl-Debuggers, was ein "xterm" ist, gebissen.
Es sucht speziell nach der Zeichenfolge "xterm". Er möchte xterm
in der Umgebungsvariable TERM
sehen. Nicht gnome-terminal
. Nicht xterm-256color
. Nur xterm
.
Lauf mit:
%Vor%um sicherzustellen, dass es das Bild bekommt. Ich habe das erst nach zehn Minuten Gruseln am Perl-Debugger herausgefunden.
Es scheint sehr glücklich zu sein, tonnenweise xterm-Fenster zu erzeugen und es scheint übrigens nicht gut zu sein, sie zu bereinigen, wenn es austritt.
Wenn Sie Zugriff auf die Konsole und einen GUI-Desktop haben, führen Sie den Debugger in einem xterm-Fenster aus. Der Perl-Debugger arbeitet nahtlos mit xterms zusammen, wie die Warnmeldung darauf hinweist. Wenn neue Prozesse erstellt werden, öffnet der Debugger neue xterm-Fenster und Sie können die Ausführung in jedem beliebigen Prozess in beliebiger Reihenfolge ausführen.
In jedem Fall ist das Löschen des inhibit_exit
-Flags ebenfalls hilfreich, um Multiprozess-Programme zu debuggen. Führen Sie
von der Debugger-Eingabeaufforderung. Auf diese Weise unterbricht der untergeordnete Prozess den Debugger nicht mit der Nachricht Debugged program terminated. Use q to quit or R to restart ...
, wenn Sie einen neuen Prozess ausführen, der Perl ausführt, und zu keinem Zeitpunkt innerhalb des untergeordneten Prozesses einen Fehler auftritt.
Das Ausführen des Debuggers in einem Xterm-Fenster ist wahrscheinlich die einfachste Lösung für dieses Problem, aber dieser Artikel beschreibt eine Alternative Ansatz: Es gibt eine undokumentierte Variable $DB::fork_TTY
, die eine bestimmte TTY für gegabelte Prozesse zuweisen kann.
Natürlich möchten Sie diese Art von Logik in Ihrem Code wahrscheinlich nicht fest codieren. Daher können Sie ein Debugger-Modul erstellen, das Sie nur dann verwenden, wenn Sie das -M Flag in Ihrem perl-Befehl benötigen.
In diesem Fall kann es durchaus sinnvoll sein, Protokolldateien (mit der PID des Prozesses in jeder Zeile) zu erstellen. Obwohl es nicht so praktisch ist wie der Debugger, wird es wahrscheinlich eine einfache Möglichkeit sein, zu verstehen, was mit Ihrem Code passiert.