9
votes

Écrire un débogueur de Python de fer

En tant qu'exercice d'apprentissage, je me écrivais une simple extension / plugin / cadre macro à l'aide de IronPython - j'ai obtenu les bases de travail, mais j'aimerais ajouter un support de débogage de base pour faciliter l'utilisation de mon éditeur de script de travailler avec .

Je cherche un peu sur Internet un peu et j'ai trouvé quelques bonnes ressources sur la rédaction de la rédaction de pipugeuses gérées (y compris l'excellent . Blog de débogage net et le MSDN DocuTaiton sur le API de débogage CLR ) - Je comprends que Ironpython est essentiellement en dehors de cela, je suis un peu perdu sur la façon de commencer, notamment:

  • y a-t-il des différences significatives entre le débogage d'une langue dynamique (telle que IronPython) à une statique (telle que C #)?
  • Dois-je exécuter mon script de manière particulière d'obtenir Irynthon de produire des informations de débogage appropriées?
  • Le débogage d'un script fonctionnant à l'intérieur du processus actuel va causer des blocages ou IronPython exécute mon script dans un processus d'enfant?
  • Est-ce que je ferais mieux de chercher à produire un simple débogueur C # simple pour obtenir l'idée générale?

    (Je ne suis pas intéressé par l'aspect interface graphique de faire un débogueur pour l'instant - j'ai déjà eu une très bonne idée de la façon dont cela pourrait fonctionner)


1 commentaires

Cette question répond à une de mes questions: Stackoverflow.com/questions/676188/...


3 Réponses :


6
votes

Je ne suis pas d'expert à IronPython, mais j'ai une certaine expérience dans le débogage des applications gérées à l'aide de Windbg. J'ai regardé brièvement comment les applications Ironpython regardent dans le débogueur. En raison de la nature dynamique de Python, beaucoup de code est émis au moment de l'exécution. Cela fait de déboguer une application Ironpython un peu plus compliquée que de dire une application C # car vous avez une couche supplémentaire de génération de code afin de parler.

Harry Pierson qui était fortement impliqué dans le développement des langues de fer a une série de blogs sur Écrire un débogueur IronPython , qui a beaucoup de détails.


1 commentaires

Merci pour le lien - je le lis à travers maintenant et ça a l'air bien.



10
votes

Quelques liens supplémentaires ont commencé à en faire beaucoup plus clairement - il y a 2 façons d'ajouter un soutien de débogueur que j'ai vu:

Débogage IronPython en tant qu'application CLR

Le premier consiste à utiliser le fait que IronPython émet une IL et de déboguer en utilisant des techniques standard utilisées pour le débogage des applications .NET. Harry Pierson ICI sur le développement de IPYDBG - un débogueur Python qui utilise cette approche.

  • Voir Ce message Pour une vue d'ensemble de la fonctionnalité de débogage .NET est exposée et les différents emballages autour de celui-ci (MDBG)
  • L'inconvénient de cette approche est que cette forme de débogage bloque complètement l'application en cours de débogage. Vous devez donc exécuter vos scripts dans une deuxième application.

    Utilisation de Microsoft.Scripting.Debugging

    En raison de cette limitation, la bibliothèque Microsoft.Scripting.Debugging a été fabriquée à la place, qui est beaucoup plus adaptée aux applications qui exécutent Ironpython "intégré" (c'est-à-dire dans le même processus).

    Il y a une introduction à celle-ci ici et un article de blog plus étendu sur la façon dont il a utilisé ici - il consiste essentiellement à une fonction de rappel qui est exécutée à chaque fois que quelque chose" intéressant "se produit (chaque fois que nous entrons dans une fonction, chaque fois que nous entrons dans une fonction Il est temps de revenir d'une fonction et chaque fois qu'une ligne est exécutée). L'exécution du script est bloquée lorsque la fonction de rappel est en cours d'exécution, ce qui vous permet de "casser" le script.

    J'ai décidé de prendre la deuxième approche - je vais mettre à jour cet article car je trouve plus d'informations qui pourraient être utiles à d'autres personnes qui pourraient essayer de le faire.


0 commentaires

0
votes

au logiciel Alternet ( www.altersetsoft.com ) Nous avons mis en œuvre le débogage de C # et IronPython, et Nous avons constaté que la principale différence que pour C # débogage, vous ne pouvez pas vraiment avoir du débogueur et que le script est débogué pour faire partie du même processus. Nous avons essayé peu de techniques décrites ici, mais ne pouvaient pas vraiment faire fonctionner de manière fiable.

https://docs.microsoft .Com / fr-US / Archive / Blogs / JMStall / You-Cant-Debug-vous-même

Donc, afin que vos scripts soient débogués, vous devez soit utiliser un débogueur autonome, soit pour écrire des scripts de manière à ce qu'ils puissent être compilés dans l'exécutable séparé (mais cela signifierait que pour accéder à l'application. -Define Objets Ce script devra interagir avec l'application à l'aide de techniques de communication interprocesses). Vous pouvez trouver un peu plus d'informations ici: https://www.alternetsoft.com/ Nouvelles / problèmes connus-de-net-script-exécutant-et-débogage

Les langues dynamiques, telles que IronPython, sont beaucoup plus permissives en ce sens - vous pouvez mettre en œuvre le débogage dans votre propre processus.

Le script étant débogué doit être exécuté dans le thread séparé, donc si nécessaire pour accéder aux objets d'application, cela doit être effectué en mode de sécurité de thread-Safe - comme à l'aide d'appels synchronisés sur le fil de l'interface utilisateur avec invoke. Potentiellement, il peut être évité avec la mise en œuvre de sa propre boucle de message lors du débogage, mais nous ne l'avons pas encore essayé (encore).

Dmitry


0 commentaires