6
votes

Déboguer un langage de script comme Ruby

Je suis essentiellement du monde de la programmation linguistique C, en train de plonger dans le monde des langages de script comme Ruby et Python.

Je me demande comment faire du débogage. Actuellement, les étapes que je suive est,

  • Je complète un grand script,
  • commenter tout sauf la partie i Voulez-vous vérifier
  • exécuter le script

    Bien que cela fonctionne, je ne suis pas en mesure de déboguer comme comment je voudrais faire, disons, un environnement VC ++ ou quelque chose comme ça.

    Ma question est, y a-t-il un meilleur moyen de déboguer?

    Remarque: je suppose que cela peut être une question répétée, si oui, veuillez me pointer la réponse.


2 commentaires

Si vous pensez que cela pourrait être une question de répétition, pourquoi ne pas la chercher sur le débordement de la pile avant de le demander?


@Chris Lutz, j'ai cherché avant de poser cette question et n'a pas pu trouver de succès. Mais j'étais sûr que c'est un sujet aussi générique qu'il devrait y avoir quelques questions posées plus tôt ...


11 Réponses :


4
votes

On dirait que le problème ici est que votre environnement (Visual Studio) ne prend pas en charge ces langues, et non que ces langues ne prennent pas en charge les débuggeurs en général.

Perl, Python et Ruby ont tous des débuggeurs entièrement présentés; Vous pouvez trouver d'autres idées qui vous aident aussi. Pour Ruby, il y a rubymine ; Pour Perl, il y a Komodo . Et c'est juste sur le dessus de ma tête.


0 commentaires

6
votes

Voici un Screencast sur Ruby Débogage avec Ruby-Débug.


0 commentaires

2
votes

Si vous travaillez avec Python, vous pouvez trouver une liste d'outils de débogage ici auquel je veux juste ajouter Eclipse avec le Extension Pydev , qui fait fonctionner avec des points d'arrêt, etc. également très simple.


0 commentaires

2
votes

Les langues de script n'ont aucune différence par rapport à d'autres langues en ce sens que vous devez toujours briser vos problèmes en pièces gérables - c'est-à-dire des fonctions. Ainsi, au lieu de tester l'ensemble du script après avoir terminé l'ensemble du script, je préfère tester ces petites fonctions avant de les intégrer. TDD aide toujours.


0 commentaires

3
votes

Il y a une belle introduction douce au débogueur Python ici < / p>


0 commentaires

10
votes

Votre séquence semble être entièrement reculée vers moi. Voici comment je le fais:

  1. J'écris un test pour la fonctionnalité que je veux.
  2. Je commence à écrire le script, à exécuter des bits et vérifiant les résultats du test.
  3. J'examine ce que j'avais fait pour documenter et publier.

    Plus précisément, je l'exécute avant je complète. C'est bien trop tard à ce moment-là.

    Il y a des difficultés, bien sûr, mais avec de bons tests et un bon design, je n'ai presque jamais besoin d'un.


5 commentaires

Tout le monde n'est pas tout à fait de ce gung-ho à ce sujet (tests d'écriture avant le code réel), mais des tests unitaires sont extrêmement importants pour ce type de chose à Ruby.


Le débogage est essentiel à la recherche de bugs câblés, mais de vérifier que votre code fait en réalité ce que vous souhaitez pendant le processus de développement Les tests d'unités sont bien meilleurs et que vous obtenez la possibilité de les reproduire.


TDD est essentiel pour prévenir les bugs, supprimer tout besoin de pratiques de débogage complexes.


Les debuggers ont définitivement leurs utilisations


@ S.Lott Exactement, mais les debuggers ont toujours un sens lorsque le code écrit par d'autres échoue. Lorsque TDD a laissé passer des bugs, vous pourriez toujours avoir besoin d'un débogueur pour les réparer.



0
votes

Il y a une question si question sur des ides rubis ici - et à la recherche de " Ruby IDE "offre plus.

Je complète un grand script

C'est ce qui a attiré mon attention: "Terminé", signifie "fait", "fini", "publié". Si vous écrivez ou non des tests avant d'écrire les fonctions qui les transmettent, ou si vous écrivez ou non des tests de tous (et je vous recommande de le faire) Vous ne devez pas écrire de code qui ne peut pas être exécuté (qui est un test en soi ) jusqu'à ce qu'il soit devenu grand. Ruby et Python offrent une multitude de façons d'écrire de petits morceaux de code individuellement testables (ou exécutables), de sorte que vous n'avez pas à attendre (?) Jours avant de pouvoir exécuter la chose.

Je construis un script de traduction / de transformation de la base de données (ruby) en ce moment - il s'agit d'environ 1000 lignes et toujours pas faite. Je gagne rarement plus de 5 minutes sans l'exécuter, ni du moins à courir la partie sur laquelle je travaille. Quand il se casse (je ne suis pas parfait, cela brise beaucoup ;-p) Je sais où le problème doit être - dans le code que j'ai écrit au cours des 5 dernières minutes. Le progrès est assez rapide.

Je ne fais pas affirmer que les IDES / Detchuggers n'ont pas de place: certains problèmes ne font pas surface avant que un grand corps de code soit publié: il peut être vraiment utile à l'occasion de lâcher le tout dans un environnement de débogage pour découvrir que se passe-t-il. Lorsque des bibliothèques et des cadres tiers sont impliqués, il peut être extrêmement utile de déboguer dans leur code pour localiser les problèmes (qui sont généralement - mais pas toujours liés à la compréhension défectueuse de la fonction de bibliothèque).


0 commentaires

0
votes

Vous pouvez déboguer vos scripts Python à l'aide du module PDB inclus. Si vous voulez un débogueur visuel, vous pouvez télécharger WinPDB - Ne soyez pas reporté par ce préfixe "gagnant", WinPDB est une plate-forme croisée.


0 commentaires

2
votes

Ma question est, y a-t-il un meilleur moyen de déboguer? "

oui.

Votre approche, "1. Je remplis un grand script, 2. Commenter tout sauf la partie que je veux vérifier, 3. Exécuter le script" n'est pas vraiment le meilleur moyen d'écrire un logiciel dans une langue (désolé, mais C'est la vérité.)

N'écrivez pas une grande chose. Jamais.

fais cela.

  1. décompose votre problème dans des classes d'objets.

  2. pour chaque classe, écrivez la classe par

    2a. Décrivez la classe, concentrez-vous sur l'interface externe et non aux détails de la mise en œuvre.

    2b. Écrire des tests pour prouver que l'interface fonctionne.

    2c. Exécutez les tests. Ils échoueront, puisque vous ne décrivez que la classe.

    2d. Réparer la classe jusqu'à ce qu'il passe le test.

    2e. À certains moments, vous réaliserez que vos conceptions de classe ne sont pas optimales. Réfacteur votre conception, assurant que vos tests passent toujours.

  3. Maintenant, écrivez votre script final. Cela devrait être court. Toutes les classes ont déjà été testées.

    3a. Décrivez le script. En effet, vous pouvez généralement écrire le script.

    3b. Écrivez certains cas de test qui prouvent les travaux de script.

    3c. Runt les tests. Ils peuvent passer. Vous avez terminé.

    3d. Si les tests ne passent pas, les choses fixes jusqu'à ce qu'ils font.

    Ecrire beaucoup de petites choses. Il fonctionne beaucoup mieux à long terme que l'écriture d'une grande chose et de commenter les parties de sortir.


5 commentaires

TDD est une méthodologie, et non un outil de débogage comme l'OP est question.


@Josh Smeaton: Le débogage est une technique; Donc, TDD est TDD. Je préfère la technique TDD sur la technique d'écriture et de débogage. Ça marche mieux pour moi.


S. Lott, le débogage n'est pas une "technique" - et même s'il s'agissait d'une "technique" (UGH), il n'est pas complètement remplacé par TDD.


@Banister: Si le débogage n'est pas une technique, qu'est-ce que c'est? Cela semble certainement comme une chose que les gens qui nécessitent des compétences. Ce n'est pas une méthodologie. Et, le débogage change de façon spectaculaire avec TDD à un exercice d'écriture de plus en plus de tests pour surmonter un problème. Cela ressemble à une technique pour moi.


Le débogage est une tâche, pas une technique. Juste comme code d'écriture est un code de débogage de tâche est une autre tâche de fixer des choses. TDD est comment écrire du code de manière à ne pas avoir à le déboguer. Pourtant, TDD ne résout pas le problème créé par le code que vous n'avez pas écrit. Disons que vous utilisez une fonction ajoutez qui ajoute correctement tous les nombres sauf 12324 + 54532 donnerait 12 car un idiot a fait que l'un des identiques improbables est un cas spécial quelque part. .. C'est quand un débogueur a beaucoup de sens ...



0
votes

La méthode de débogage que vous avez décrite est parfaite pour une langue statique comme C ++, mais étant donné que la langue est si différente, les méthodes de codage sont similaires différentes. L'une des grandes choses très importantes dans une langue dynamique telle que Python ou Ruby est la couche de topletelle interactive (ce que vous obtenez en tapant, disons python sur la ligne de commande). Cela signifie que l'exécution d'une partie de votre programme est très facile.

Même si vous avez écrit un grand programme avant de tester (ce qui est une mauvaise idée), il est espéremment séparé en plusieurs fonctions. Ainsi, ouvrez votre niveau de toplevel interactif, faites une chose importation (pour quelque chose se trouve être), puis vous pouvez facilement commencer à tester vos fonctions un par un, appelez-les simplement sur le nombril.

Bien sûr, pour un projet plus mature, vous souhaitez probablement écrire une suite de tests réelle et la plupart des langues ont une méthode pour le faire (en python, c'est doctest et et Nez , je ne sais pas d'autres langues). Au début, cependant, lorsque vous écrivez quelque chose de pas particulièrement formel, rappelez-vous simplement quelques règles simples de débogage de langues dynamiques:

  • commencer petit. N'écrivez pas de gros programmes et testez-les. Testez chaque fonction lorsque vous l'avez écrit, au moins cursorement.
  • Utilisez le nombril. En cours d'exécution de petits morceaux de code dans une langue comme Python, est extrêmement léger: enfoncez le nombril et le gérer. Comparez-le à la rédaction d'un programme complet et de la compilation, dites, C ++. Utilisez ce fait que vous pouvez changer rapidement l'exactitude de n'importe quelle fonction.
  • Les débuggeurs sont utiles. Mais souvent, les déclarations imprimer . Si vous utilisez uniquement une seule fonction, le débogage avec impression n'est pas si gênant et vous libère de glisser le long d'une IDE.

0 commentaires

0
votes

Il y a beaucoup de bons conseils ici, je recommande de faire passer des meilleures pratiques:

http://github.com/edgecase/ruby_koans

http://blog.rubybestpractices.com/

http: // sur -Ruby.blogspot.com/2009/01/Ruby-Best-Protacties-Mini-interview-2.html

(et lire le livre de Greg Brown, c'est superbe)


Vous parlez de gros scripts. Beaucoup de mon flux de travail traverse la logique en IRB ou à la coquille Python, puis les capturer dans une cascade de petites méthodes ciblées à une tâche à une seule tâche, avec des tests appropriés (pas 100% de couverture, plus de concentration sur les caisses de bord et de coin). < / p>

http: //binstock.blogspot .COM / 2008/04 / Perfectionning-Oos-Small-Classes-and-short.html


0 commentaires