Question

Scénario:

Il y a une pièce complexe de logiciel qui est gênant pour lancer la main. Ce que je l'ai fait est de créer un script python pour lancer l'exécutable et joindre gdb pour le débogage.

Le script de lancement du processus:

  • assure une variable d'environnement est définie.
  • assure un répertoire de construction locale est ajouté à la variable LD_LIBRARY_PATH de l'environnement.
  • modifie le répertoire de travail courant à l'endroit où l'exécutable attend d'être (pas ma conception)
  • lance l'exécutable avec un fichier config la seule option de ligne de commande
  • pipes la sortie de l'exécutable pour un second processus d'enregistrement
  • se souvient PID de l'exécutable, puis lance et attache à gdb exécutable en cours d'exécution.

Les travaux de script, avec une mise en garde. ctrl-c ne pas interrompre le debugee et le retour à un contrôle gdb. Donc, si je « continue » sans points d'arrêt actif, je ne peux jamais arrêter de nouveau le processus, il doit être tué / interrompu d'une autre coquille . BTW, en cours d'exécution « kill -s SIGINT » où est le pid debuggee ne me retourner rapidement de GDB ... mais il est vraiment ennuyeux d'avoir à faire les choses de cette façon

Tout d'abord je pensais que Python saisissait le signal SIGINT, mais cela ne semble pas être le cas comme je l'ai mis en place des gestionnaires de signaux transmet le signal au debugee et cela ne résout pas le problème.

J'ai essayé différentes configurations du script python (appelant os.spawn * au lieu de sous-processus, etc.) Il semble que quelque façon que je vais à ce sujet, si python a lancé le processus de l'enfant, les signaux SIGINT (ctrl-c) NE PAS routés à gdb ou le processus de l'enfant.

ligne actuelle de penser

  • Cela peut être lié à un besoin processus distinct id groupe pour le debugee & gdb ... foi à ce sujet?
  • bug possible avec SELinux?

Info:

  • gdb 6.8
  • Python 2.5.2 (problème actuel avec Python 2.6.1, ainsi)
  • SELinux environnement (bug délivrant des signaux aux processus?)

Alternatives je l'ai considéré:

  • Mise en place d'un fichier .gdbinit faire autant de ce que le script fait, les variables d'environnement et répertoire de travail sont un problème avec cette approche.
  • Lancement exécutable et la fixation GDB manuellement (yuck)

Question: Comment avez-vous automatisez le lancement / mise au point de projets à grande échelle?

Mise à jour: J'ai essayé les exemples de Nicholas Riley ci-dessous, sur mon Macintosh à la maison, ils permettent tous cntl-c de travailler à des degrés de varrying, sur les bécanes de production (que je maintenant penser qu'ils peuvent être en cours d'exécution SELinux) ils ne le font pas ...

Était-ce utile?

La solution

Au lieu de transmettre le signal au debuggee de Python, vous pouvez essayer simplement l'ignorer. Ce qui suit a fonctionné pour moi:

import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)

import subprocess
cat = subprocess.Popen(['cat'])
subprocess.call(['gdb', '--pid=%d' % cat.pid])

Avec cela, j'ai pu ^ C à plusieurs reprises dans GDB et interrompre le debuggee sans problème, mais je l'ai vu un comportement bizarre.

Incidemment, j'avait également pas de problème lors de la transmission du signal dans le processus cible.

import subprocess
cat = subprocess.Popen(['cat'])

import signal, os
signal.signal(signal.SIGINT,
              lambda signum, frame: os.kill(cat.pid, signum))

subprocess.call(['gdb', '--pid=%d' % cat.pid])

Alors, est peut-être autre chose va dans votre cas? Il pourrait aider si vous avez publié un code qui casse.

Autres conseils

Vos notes de commentaire que vous avec du mastic dans l'exécution de ssh ... Avez-vous un terminal de contrôle? Avec OpenSSH vous voulez ajouter l'option -T, je ne sais pas comment / si le mastic va faire la façon dont vous l'utilisez.

De plus. Vous pouvez essayer d'utiliser ssh cygwin au lieu de mastic

si vous disposez déjà d'un script en cours mis en place pour le faire, mais des problèmes en automatisant une partie, vous pouvez peut-être juste attraper attendre et l'utiliser pour fournir la configuration, puis retomber en mode interactif en attendre pour lancer la processus. Ensuite, vous pouvez toujours avoir votre ctrl-c disponible pour interrompre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top