2010-10-17 10 views
2

J'essaie de déboguer le programme simple Hello World fourni avec Eclipse CDT. L'exécution du programme fonctionne normalement correctement, mais lorsqu'il est exécuté en mode débogage, puts() n'imprime rien sur la console.Problème avec le débogage dans Eclipse CDT

J'ai essayé d'exécuter le même programme avec gdb directement et cela fonctionne bien, en imprimant "!!!Hello World!!!" comme prévu.

Pourquoi le puts() n'imprime rien lorsqu'il s'exécute en mode débogage via Eclipse?

Je suis sous Windows avec MinGW installé, gcc 4.5.0 en cours d'exécution, gdb 7.2 et CDT 7.0.1

Répondre

4

Merci à la Suisse ont indiqué la bonne direction.
Ajout fflush(stdout) après chaque printf, puts phrase ne convient pas à un grand projet lors débogage (Lorsque libérant, your'd mieux à l'aide fflush() à un moment approprié).
Ensuite, nous pouvons utiliser les directives du préprocesseur #ifdef & & setbuf().
Dans Eclipse, votre projet C -> Propriétés -> C/C++ Build -> Paramètres: Confgiguration = "Débogage [Actif]" -> Paramètres d'outil -> Compilateur GCC C -> Symboles -> Ajouter "_DEBUG",

ensuite dans votre main(), en utilisant:

#ifdef _DEBUG 
setbuf(stdout,NULL); // this disables buffering for stdout. 
#endif 
1

Avez-vous essayé de joindre \ n dans l'instruction met? C'est à dire. puts ("Bonjour tout le monde! \ n"); Parfois, le terminal a besoin \ n de vider le flux.

+0

Cela ne fonctionne pas, mais il m'a fait comprendre que le tampon pourrait ne pas être le rinçage. Merci de m'indiquer dans la bonne direction! – Swiss

1

J'ai compris pourquoi cela se produit. Lors de l'exécution de GDB via un terminal, STDOUT est mis en mémoire tampon, ce qui signifie qu'il sera vidé chaque fois qu'une nouvelle ligne est lue, ce qui entraîne le comportement attendu.

CEPENDANT! Eclipse CDT exécute GDB avec STDOUT en mode de blocage de blocs, ce qui signifie qu'il ne purge que STDOUT lorsqu'il atteint une certaine taille ou s'il est vidé manuellement. Depuis la chaîne "!!! Hello World !!!" est si court, le tampon pour STDOUT ne sera jamais vidé sauf si un appel à fflush() est effectué. J'ai réussi à résoudre ce problème en ajoutant fflush(stdout); après l'appel au puts().

Voici le code qui en résulte:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    puts("Hello World!"); /* prints !!!Hello World!!! */ 
    fflush(stdout); 
    return EXIT_SUCCESS; 
} 
Questions connexes