2016-03-29 2 views
1

Ich möchte gdb (GNU Debugger) im virtuellen Schirmterminal laufen lassen und die Ausgabe in der Realzeit auf angrenzender Schirmansicht grep.Wie man stdout in Linux teilt (grep parallel in einer anderen Ansicht laufen lassen)

Wie implementiere ich diese Anordnung? Normale Pipe leitet nur die Ausgabe um. Ich bin auch neugierig, wie man Bildschirmansicht (^ A + c) an einen vorhandenen Prozess für IO bindet.

EDIT:

Ich kam mit der folgenden Lösung auf. Erstellt eine Named Pipe mit mkfifo Rohr und ausgeführt gdb Programm | T-Stück in pty1. Dies wird die Ausgabe in eine Pipe duplizieren. In pty2 Ich führte weniger -f Rohr | grep foo, um die Zeilen von Interesse zu drucken.

Ich bin sicher, dass es für solch eine triviale Aufgabe einen einfacheren Weg geben muss.

EDIT2:

Das oben erwähnte Verfahren scheint etwas fehlerhaft. Gdb druckt nichts auf seine Konsole, es sei denn, etwas liest tatsächlich aus dem FIFO. Warum das? Auch wenn ich diese Methode mit meinem eigenen Programm ausprobiere, das einfach HelloWorld druckt, wird in keiner der beiden Ansichten nichts gedruckt.

EDIT3:

ich es absichtlich ist herausgefunden, dass T-Blöcke, wenn niemand aus dem Rohr tatsächlich liest. Eine Frage der Synchronisation. Dennoch frage ich mich, wie das ursprüngliche Programm in der Lage ist, die Eingabe von der Tastatur zu lesen, selbst T-Steuerelemente jetzt das Terminalfenster. Oder ist es so, dass der Terminal-Eingang zu stdin des ursprünglichen Programms geht und an stdout von Tee ausgegeben wird?

+1

Verwenden Sie eine Datei anstelle einer Rohrleitung, um das Blockieren zu verhindern. Verwenden Sie dann 'tailf', um diese Datei anzusehen (oder' tail -f' um mehrere Dateien zu sehen). –

+0

Das scheint eine gute Lösung zu sein. Bietet der Kernel einen nicht blockierenden Pipe-Mechanismus, d. Daten zwischen Prozessen übertragen, ohne auf Festplatte zu schreiben? Ich bin auch auf ein interessantes Problem gestoßen: Wenn ich etwas drucke und danach schlafe, wird nichts jemals in die Pipe geschrieben, auch wenn der Schlaf erledigt ist. Wieso ist es so? –

+0

Input und Output sind normalerweise liniengepuffert, benutzen 'fflush()' oder schreiben eine Zeilenendung. Warum funktioniert eine temporäre Datei nicht? Ich hatte den Eindruck, dass es nur für das Debug-Logging war. Wenn Sie etwas anderes brauchen, müssen Sie genauer darüber sein. –

Antwort

0

Sie müssen Ihr Programm nicht von gdb starten. Starten Sie es einfach in einem Bildschirmfenster und bestimmen Sie pid (verwenden Sie top, pgrep, ps).

In anderen Fensterbereich starten Sie die gdb Sitzung:

gdb <path_to_program> <pid> 

Auf diese Weise können Sie ein Terminal haben gdb und ein Terminal zu steuern, sowohl das Programm, das Sie debuggen, verwenden, um ihre eigenen Ein- und Ausgänge haben.

Die einzige Bedingung ist, dass das Programm lange genug ausgeführt wird, um den Debugger an den Prozess anzuhängen. Eine einfache Möglichkeit besteht darin, es am Anfang auf Eingaben warten zu lassen. Sie könnten es auch drucken pid.

+0

Ich denke, Sie missverstehen meine Absicht. Das Programm in der anderen Ansicht ist nicht das zu debuggende Programm, sondern das Programm, das den Konsolentext von gdb empfängt und es filtert/formatiert. In diesem Fall grep, drucke nur die Zeilen, die ich interessiert. –

Verwandte Themen