Wie debugge Perl-Skripte, die fork

8

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?

    
Frank Klotz 18.11.2010, 04:20
quelle

4 Antworten

3

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.

    
Craig Ringer 09.07.2013, 06:46
quelle
5

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

aus %Vor%

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.

    
mob 18.11.2010 16:20
quelle
3

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.

    
Mansoor Siddiqui 13.01.2011 15:23
quelle
1

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.

    
singingfish 18.11.2010 05:39
quelle

Tags und Links