2010-08-23 24 views
18

Ich versuche, Gdb Programme mit Eingabeumleitung auf Stdin auszuführen. Zum Beispiel, ohne gdb würde ich ein Programm wie folgt ausführen:Eingabeumleitung in Gdb (MinGW)

prog < input.txt 

Jetzt in GDB, der übliche Weg, dies zu tun ist run < input.txt. Es funktioniert jedoch nicht für mich und wenn das getan wird, wird nichts in stdin umgeleitet.

Ich benutze Windows mit MinGW. Was könnte das Problem sein?

Antwort

2

Ich stieß auf das gleiche Problem hier, und ich habe mir angewöhnt, ein Kommandozeilenargument hinzuzufügen, um Eingaben aus einer Datei zu erfassen.

z.B. Parsing eines "-i ifile" -Arguments mit argc und argv, um eine Eingabe von ifile anstelle von stdin zu erhalten und eine "-o-Datei" zu analysieren, um die Ausgabe in eine Datei anstelle von stdout zu schreiben.

Dann verwende ich nur diese Argumente anstelle von Weiterleitungen.

Die Tools, die mit MinGW geliefert werden, sind oft nicht die neuesten Versionen und haben oft Funktionen weggelassen. :: shrug ::

12

Bereits in den späten 90er Jahren war eine defekte Befehlszeilenumleitung eine known and assumed limitation. Mein Verdacht ist, dass es so bleibt, da der mingw32 Port von immer noch witzig alle run Argumente (einschließlich Redirects) an den Debugee weiterleitet.

Mehrere mögliche Abhilfen:

  1. , wenn Sie die Möglichkeit haben, die Befehlszeilenoberfläche zu verändern, dann implementieren bbadour ‚s Vorschlag
  2. sonst, wenn Sie leicht den Prozess vor dem Punkt, den Sie wollen aussetzen kann debuggen an, rufen Sie die debugee (mit Umleitung) von einem Shell und heften sich an sie, während sie bereits
  3. anders läuft, wenn Sie Symbole für die debugee (gcc -g) haben oder Sie kennen die Adresse von main() (gcc -Wl,-Map,mapfile) und einstellen können dort einen Haltepunkt, gehen Sie auf folgende Weise (getestet mit mingw gdb 6.8.0):

    # gdb debugee.exe 
    (gdb) b main 
    (gdb) run non-redirect-arguments-if-any 
    (gdb) p dup2(open("/tmp/input.txt", 0), 0) 
    (gdb) c 
    
+0

ich als OP in das gleiche Problem renne. Ich bin jedoch nicht in der Lage, die 3. Lösung für mich arbeiten zu lassen. Dies ist auf 'gdb 7.5.50'. Wie funktioniert die 2. Lösung? Wie stellst du sicher, dass das Debuggee nicht gestartet wird, wenn es gestartet wird, bevor du die Möglichkeit hast, gdb anzuhängen? – greatwolf