2010-08-23 4 views
18

J'essaye d'obtenir que gdb exécute des programmes avec la redirection d'entrée vers stdin. Par exemple, sans gdb je courrais un programme comme celui-ci:Redirection d'entrée dans gdb (MinGW)

prog < input.txt 

maintenant à gdb, comme d'habitude de le faire est run < input.txt. Cependant, cela ne marche pas pour moi et quand cela est fait, rien n'est redirigé vers stdin. J'utilise Windows avec MinGW. J'utilise Windows avec MinGW. Quel pourrait être le problème?

Répondre

2

J'ai rencontré le même problème ici, et j'ai juste pris l'habitude d'ajouter un argument de ligne de commande pour permettre l'entrée d'un fichier.

par exemple. Analyser un argument "-i ifile" en utilisant argc et argv pour obtenir une entrée de ifile au lieu de stdin et en analysant un "-o ofile" pour écrire la sortie dans ofile au lieu de stdout. Puis j'utilise simplement ces arguments au lieu de redirections.

Les outils fournis avec MinGW ne sont souvent pas les dernières versions et ont souvent des fonctionnalités omises. :: shrug ::

12

Dès la fin des années 90, la redirection de ligne de commande rompue était un known and assumed limitation. Mon soupçon est que cela reste comme ça, puisque le port mingw32 de gdb transmet toujours joyeusement verbatim tous les arguments run (y compris les redirections) au debugee.

Plusieurs solutions de contournement possibles:

  1. si vous avez la possibilité de modifier l'interface de ligne de commande, puis mettre en œuvre la suggestion de bbadour
  2. autrement, si vous pouvez facilement suspendre le processus avant le point que vous voulez déboguer à, invoquer la debugee (avec redirection) à partir d'une coquille et attacher pendant qu'il est en cours d'exécution
  3. autrement, si vous avez des symboles pour la debugee (gcc -g) ou vous connaissez l'adresse de main() (gcc -Wl,-Map,mapfile) et peut définir un point de jonction, procéder de la manière suivante (testé avec 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

Je suis en cours d'exécution dans le même problème que l'OP. Cependant, je suis incapable de faire fonctionner la 3ème solution pour moi. C'est sur 'gdb 7.5.50'. Comment fonctionne la 2ème solution? Comment vous assurez-vous que lorsque le débogueur est démarré, il ne se termine pas juste avant que vous ayez une chance de lui attacher gdb? – greatwolf