2010-06-01 4 views
6

J'écris un programme pour implémenter l'algorithme de flux maximum de Dinic sur un réseau. Les réseaux peuvent être écrits à la main ou chargés à partir d'un fichier en utilisant la redirection stdin. J'ai été capable d'utiliser gdb pour déboguer le programme avec de petits fichiers (environ 30 lignes), mais j'ai des problèmes quand j'essaie de déboguer le programme avec des fichiers plus gros (> 1000 lignes). Le code lui-même est la suivante:Problème gdb avec la redirection stdin

uint32_t read_lines = 0; 
while(!feof(stdin)) 
{ 
    err = fscanf(stdin, "%u %u %u\n", &n1, &n2, &c); 
    if (err != 3) 
    { 
     printf("read_lines=%u\n", read_lines); /*for debugging purposes*/ 
    } 
    read_lines += 1; 
    /* write to debug file */ 
    fprintf(debug, "line %u: %u %u %u\n", read_lines, n1, n2, c); 
} 

Si je lance le programme sans gdb, il fonctionne, pas correct car il génère une erreur de segmentation (ce qui est la raison pour laquelle je suis en train d'utiliser gdb), mais il passe par cette partie de "l'analyse" du fichier d'entrée (et l'écriture dans le fichier de débogage de sortie). Cependant, si je tape:

gdb --args ./dinic --mode=NUM --verbose=LOW 
(gdb) b 61 
(gdb) run < tests/numterc.in 

je reçois:

(gdb) Program exited with 01 code. 

et quand j'ouvre le fichier de débogage, il est de 2000 lignes, alors qu'il devrait être au plus 1000, qui est la longueur du fichier d'entrée . Je répète, cela se produit avec de "gros" fichiers, cela fonctionne correctement avec les petits fichiers. La question serait, ai-je manqué quelque chose lors de l'utilisation de gdb, ou est-ce un bug de gdb?

Répondre

7

Ok, je pourrais enfin obtenir une solution de rechange. Il semble que l'option --args ne fonctionne pas bien, du moins dans mon cas. J'ai gdb 6.8-debian et debian 5.0.4.

Ce que je devais faire a été exécuté gdb sans l'option --args:

$gdb ./dinic 
(gdb) b 61 
(gdb) run --mode=NUM --verbose=LOW < tests/numterc.in 

et il a bien fonctionné. Peut-être que quelqu'un peut trouver cela utile.

+0

Notez que cela ne fonctionne pas avec MinGW sur Windows, comme décrit ici: http://stackoverflow.com/a/3652530/47984 (et comme expérimenté par moi avec gdb 7.7.1 de MinGW juste maintenant). –

2

J'ai rencontré le même problème et j'ai trouvé la même solution pour spécifier les arguments en cours. L'option --args seulement peut passer des arguments, mais ne peut pas faire la redirection de stdin qui est habituellement (dans un contexte non-debug) redirigé pour vous par le shell invoquant la commande. Dans la session de débogage, votre commande est invoquée par gdbla liste d'arguments et les redirections sont spécifiées par la valeur de la variable args. En utilisant l'option --args, vous initialisez cette variable (ainsi que le fichier programme à déboguer). Il suffit de faire

(gdb) show args 

et cela devrait être initialisé à --mode=NUM --verbose=LOW dans votre cas. Mais pas de redirection, donc vous les spécifiez avec run, ce qui remplace les arguments! Donc, vous avez deux options:

  1. Veuillez également préciser le redirection dans args:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. Spécifiez également la redirection lors de l'appel run