2013-09-05 5 views
1

J'ai un script qui fonctionne depuis des jours et qui est à mi-chemin. Il y a un bug stupide qui va le faire s'écraser avant qu'il ne finisse si un certain compteur devient trop haut (le compteur est inutilisé, ça ne me dérange pas de le balancer pour que le script continue). Je n'avais pas la prévoyance d'importer un module ou d'écrire une porte dérobée pour me laisser changer d'état de quelque façon que ce soit; On m'a dit que je peux toujours aller au guichet en utilisant gdb.Comment utiliser GDB pour éditer une variable globale python 2.7?

Pour simplifier, imaginez plutôt que je parle de ce script ci-dessous, que j'ai couru de la ligne de commande comme « foo.py python »

from time import sleep 
i = 0 
while(True): 
    i += 1 
    if (i > 100): 
     raise Exception("Explosion") 
    sleep(10) 

Qu'est-ce exactement ce que je devrais taper gdb de de temps en temps pour changer la valeur de la variable i à 0, et éviter l'explosion? (Si c'est important, mon binaire python est 2.7.3).

Répondre

1

Je suis allé de l'avant et j'ai été autonome. Cela a fonctionné pour moi (non représenté - 'fichier' pour charger le binaire python, 'attacher', 'Détacher' du processus):

  1. "bt" - voir la trace de la pile
  2. "frame foo" - où foo est la première image avec la mention « gLOBALS » comme arguments à une fonction Py *
  3. « impression gLOBALS » (ou, imprimer *(PyDictObject*)globals) - confirmer que votre variable est là
  4. « vers le bas » - passer juste au-dessous du cadre que vous "s'interesse".
  5. "finir" - (peut-être inutile?) - laisser python compléter ce qu'il faisait et libérer les verrous ou autres qui pourraient interférer avec l'interfaçage avec l'objet global.
  6. "appel PyDict_SetItemString (globals," i ", PyLong_FromLong (0))" - espérons qu'il ne segfault pas. Changez "i" en fonction de votre variable.
  7. « continuer » - si vous êtes chanceux, le compteur devrait maintenant avoir été remis à 0.

Cependant, pour que cela réussisse, je pense que python2.7-gdb doit être installé/configuration AVANT vous commencez à exécuter le processus python - vous ne pouvez pas le faire après le fait, ou gdb voit une pile brouillée.

Questions connexes