2010-01-12 10 views
7

J'essaye de déboguer un serveur que j'ai écrit avec gdb comme segfaults dans des conditions très spécifiques et rares.Comment lancer gdb sur un démon en arrière-plan?

Y at-il un moyen de faire fonctionner gdb en arrière-plan (en mode silencieux ou batch?), Suivre les enfants (mon serveur est démon et se détache du PID principal) et vider automatiquement le core et le backtrace à un fichier désigné) une fois que le programme se bloque?

+0

http: // stackoverflow.com/questions/17965/générer-un-core-dump-in-linux SO poster sur la production de décharges de base –

+0

@HassanSyed: http://vmlinux.org/jocke/mirror/www.objsw.com/docs/gdb_22.html est un lien mort. – bgoodr

Répondre

6

Pourquoi pas seulement le processus de manière interactive dans une session écran persistante? Pourquoi doit-il être un démon lors du débogage? Vous pouvez également exécuter gdb dans la session d'écran et l'attacher au processus en cours d'exécution (par exemple, gdb/path/to/binary -p PID_of_binary) après le forçage.

+0

C'est en fait une excellente idée, aucune idée pourquoi je n'ai pas pensé à cela: P Merci pour la solution élémentaire! –

+0

+1 pour tmux au lieu d'écran – lkraav

1

Je ne suis pas vraiment un expert en gdb, mais deux choses viennent à l'esprit

  1. Tracepoints qui pourrait vous donner les informations nécessaires que votre programme fonctionne ou
  2. Utilisez remote debugging facility de gdb pour déboguer votre programme pendant qu'il est en cours d'exécution en tant que démon.
3

D'abord, je configurerais votre shell/environnement pour vous donner un core dump. En bash:

ulimit -c unlimited 

Une fois que vous avez la décharge de base, vous pouvez utiliser gdb pour examiner la trace de la pile:

gdb /path/to/app /path/to/core/file 
+2

Notez que le fait d'avoir le fichier core n'est pas la même chose que d'avoir le même processus arrêté sous le débogueur. Le fichier core ne conserve pas d'informations sur les descripteurs de fichiers ouverts ou l'état de mappage de la mémoire. Ce n'est donc pas toujours une suggestion utile. –

+1

Et vous ne pouvez pas appeler les fonctions définies dans le programme. –

7

En supposant que vous disposez des autorisations appropriées, vous pouvez associer gdb à n'importe quel processus. Vous pouvez le faire sur la ligne de commande avec:

gdb /path/to/binary _pid_ 

ou à l'intérieur gdb avec la commande attacher:

attach _pid_ 

Ainsi, une fois que votre démon a commencé, vous pouvez utiliser l'une de ces techniques pour attacher pour le PID final, votre démon fonctionne comme. La connexion de gdb arrête le processus que vous traquez, vous devrez donc lancer un "continuer" pour le redémarrer.

Je ne connais pas de méthode directe pour que gdb puisse exécuter des commandes arbitraires lorsque le programme se bloque. Voici une solution de contournement que je peux penser:

  1. Créer et enregistrer un gestionnaires de signal pour SIGSEGV.
  2. Dites à gdb de ne pas s'arrêter sur ce signal (handle SIGSEGV nostop)
  3. Définissez un point d'arrêt sur la première ligne de votre gestionnaire de signaux.
  4. Assigner commands to the breakpoint de l'étape 3
1

Vous pouvez jeter un oeil à la façon dont Samba facilite le débogage; il a un "panic action" configurable qui peut suspendre l'application, notifier le développeur, spawn gdb, etc., et est exécuté dans le cadre de son gestionnaire de signal. Voir lib/util/fault.c dans l'arborescence des sources de Samba.