2009-01-07 6 views
22

Comment arrêter une exécution de gdb sans point d'arrêt?GDB comment arrêter l'exécution sans point d'arrêt?

+0

Comment le processus a-t-il démarré? Comment vous y êtes-vous attaché? Par défaut, attacher avec 'gdb --pid' arrête déjà le processus. Voulez-vous dire après avoir frappé 'c'? –

Répondre

15

Il suffit d'utiliser une interruption régulière Ctrl - c fonctionnera très bien. GDB transmet simplement le SIGINT au processus de débogage qui meurt ensuite. GDB attrape l'exit non standard et interrompt le processus, ce qui vous permet d'examiner tous les threads, leurs piles et les valeurs actuelles des variables. Cela fonctionne bien, mais vous feriez mieux d'utiliser des points de rupture. La seule fois où je me trouve en train de faire ça, c'est si je pense que je suis entré dans une sorte de boucle infinie. Il suffit de taper BREAK sans argument.

+0

J'ai essayé^C mais cela n'a pas fonctionné Je ne suis pas en mesure de taper quoi que ce soit sur l'invite.Aussi le programme est multi-threadé UI, pourrait-il être le problème? – anand

+0

Ctrl-C woks comme je veux, mais je ne reproduis pas cela sur GDB 7.7.1: le processus n'a pas semblé obtenir le Ctrl-C et mourir. Il a seulement été arrêté par GDB, pas tué. Frapper 'c' à nouveau ou' detacher' le fait continuer d'où il s'est arrêté. –

4

Break, lorsqu'il est appelé sans aucun argument, rupture définit un point d'arrêt à l'instruction suivante à exécuter dans le cadre de la pile sélectionnée

+0

Dans le contexte de gdb, courir, arrêter, pas à pas. C'était exactement le genre de "stop" dont j'avais besoin, tuer l'application était expliqué dans la documentation de gdb. +1 – hobb

4

Démarrer un shell, trouver l'ID de processus en utilisant ps et l'envoyer SIGSTOP ou SIGINT en utilisant la commande kill (par exemple kill -INT pid).

10

Les applications graphiques ne réagissent pas à^C et^Casser comme les applications de console. Depuis ces jours, la plupart des projets non triviales ont tendance à être des applications ou des bibliothèques GUI principalement utilisées dans les applications de l'interface graphique, vous avez deux options:

  1. Envoyer SIGSTOP à l'application d'un terminal séparé. C'est lourd.

  2. Si vous appuyez sur^C ou^Pause à l'invite GDB, GDB se termine mais l'application reste en cours d'exécution. Vous pouvez ensuite réexécuter GDB pour y attacher à l'aide du commutateur de ligne de commande -p. Cela perd l'état du débogueur.

Dans les deux cas, vous pourriez trouver ce utile: tasklist | grepProcessName| sed -e 's/ProcessName*\([0-9]*\).*/gdbModuleName-pid=\1/' > rungdb.sh Vous pouvez modifier ceci pour une utilisation dans des scripts shell, makefile ou d'envoyer un signal au lieu d'attacher GDB .

info threads vous aidera à déterminer quel fil vous voulez regarder. Ensuite, utilisez threadThreadNumber pour y basculer.

Questions connexes