2011-05-26 4 views
8

Je développe une application (un service/démon, vraiment) sur Linux en C++ qui doit l'interface avec un morceau de matériel. Si mon programme ne libère pas les ressources pour ce matériel correctement lors de la terminaison, alors je dois recharger le pilote de périphérique, un processus qui prend environ 10 minutes et pour des raisons évidentes d'avoir à attendre 10 minutes entre chaque test du programme être frustrant.signaux lors du débogage

J'ai donc utilisé la fonction sigaction() pour attraper un SIGINT (un ctrl-c) afin que mon programme puisse fermer proprement quand j'en ai fini avec. Lors de l'exécution du programme à partir de la console, cela fonctionne très bien. Cependant, lors du débogage dans Netbeans ou Eclipse (j'ai essayé les deux), les choses ne fonctionnent pas.

  • Dans Eclipse, si je frappe ctrl-c dans la console il fournit, il ne semble pas enregistrer qu'un SIGINT jamais produit
  • Dans Eclipse, si je lance le programme en mode débogage, puis utilisez kill -SIGINT <pid>, le programme se casse comme s'il touchait un point d'arrêt
  • Netbeans semble effectivement réaliser qu'un signal a été envoyé lorsque je clique sur ctrl-c dans la console, et ouvre une boîte de dialogue demandant si je veux le transférer à l'application . En cliquant sur "Forward and continue" semble juste casser le programme et le signal n'est pas reçu par l'application. Il dit aussi que je peux configurer ce genre de choses dans Debug -> Dbx configure, un élément de menu qui n'existe pas
  • Dans NetBeans, si j'exécute le programme en mode debug et que j'utilise ensuite kill -SIGINT <pid>, le comportement est le même que ci-dessus
  • I On ajoute alors un gestionnaire d'SIGQUIT et essayé d'envoi que via kill lors du débogage dans Netbeans. Cette fois, aucune boîte de dialogue n'apparaît et le gestionnaire de signal n'est jamais déclenché.

J'ai besoin une certaine façon de éteindre correctement mon application alors que je suis le débogage. Des idées?

Répondre

7

Il se trouve le problème n'a rien à voir avec Netbeans ou Eclipse, mais plutôt gdb.

gdb peut être configuré pour traiter des signaux dans une variété de façons. Si vous exécutez:

gdb

puis tapez:

info signals

Vous obtiendrez une liste de signaux et GDB actions sur ce qu'il faut faire si elle reçoit ce signal:

Signal  Stop  Print Pass to program Description 

SIGHUP  Yes  Yes  Yes    Hangup 
SIGINT  Yes  Yes  No    Interrupt 
SIGQUIT  Yes  Yes  Yes    Quit 
SIGILL  Yes  Yes  Yes    Illegal instruction 
SIGTRAP  Yes  Yes  No    Trace/breakpoint trap 

etc ...

Mon tempo Il a fallu utiliser SIGALRM, que gdb n'utilise pas par défaut pour le processus. Cependant, vous pouvez également personnaliser les paramètres de gdb par défaut en créant un fichier .gdbinit où vous pouvez définir ces

+0

Alors, est-il possible de faire gdb gérer SIGINT judicieusement? Quel serait le contenu '.gdbinit' à faire? –

2

solution simple .. Essayez d'utiliser des macros DEBUG pour gérer votre situation.

// Register the signal handler to stop service. 
#ifdef _DEBUG 
     signal(SIGKILL, <your signal handler>); 
#endif 

En outre, vous pouvez essayer de nettoyer votre application avant de quitter.

+0

Merci pour cela, mais comment est-ce que je choisirais quand mettre fin à la demande? Si je viens de mettre cela à la fin de mon bloc main() ou similaire, le service commencerait et s'arrêterait immédiatement – Frederik

+1

Expliquer 'comment choisirais-je quand mettre fin à l'application?' :) –

+0

Comme je l'ai dit, ce sera un service ou un démon. Parfois, je n'aurai besoin de le tester que quelques secondes, d'autres fois je devrai faire des tests plus poussés. Le fait est, je ne peux pas dire Sleep pendant 15 secondes et ensuite envoyer un signal - je dois être en mesure de terminer le programme au moment de mon choix. – Frederik

6

Même ce poste est vieux, espérons qu'il peut aider les autres.

Pour empêcher Eclipse d'intercepter le Ctrl + C, vous pouvez configurer votre gdb à l'aide du fichier .gbdinit. Vous créez un .gdinit avec ce contenu

#we want Ctrl+C to be no break, pass to application and printed by the debugger 
handle SIGINT nostop 
handle SIGINT pass 
handle SIGINT print 

Dans la configuration de votre éclipse, vous pouvez définir où est votre fichier .gdbinit à utiliser dans votre configuration de débogage

Eclipse capture

Questions connexes