web-dev-qa-db-fra.com

Comment déboguer sans IDE?

Chaque fois que je cherche un IDE (actuellement je bricole avec Go), je trouve un fil plein de gens recommandant Vi, Emacs, Notepad ++ etc. etc.

Je n'ai jamais fait de développement en dehors d'un IDE; Je suppose que j'ai été gâté. Comment déboguer sans IDE? Êtes-vous limité à la simple journalisation?

62
ConditionRacer

En utilisant un débogueur. Pour l'essentiel, c'est aussi ce que fait un IDE en arrière-plan - il enveloppe simplement l'expérience dans une interface graphique.

Sous Unix, l'un des débogueurs les plus couramment utilisés est GNU gdb, qui a largement supplanté les premiers débogueurs Unix tels que dbx.

Pour avoir une idée de ce à quoi ressemble/se sent le débogage à partir de la ligne de commande, vous pouvez consulter le manuel gdb .

Comme dans d'autres domaines, l'utilisation d'un débogueur à partir de la ligne de commande nécessite l'apprentissage d'une syntaxe et d'un ensemble de commandes, mais apporte avec lui beaucoup de flexibilité et de scriptabilité . D'un autre côté, si vous êtes déjà à l'aise avec un éditeur tel que vim ou emacs, vous pouvez constater que votre éditeur préféré a un plug-in pour votre débogueur préféré.

86
jimwise

J'ai utilisé un débogueur pendant plusieurs années alors que j'écrivais des pilotes graphiques. J'avais un deuxième ordinateur qui exécutait le débogueur contre le premier (car l'écran de l'ordinateur principal ne fonctionnait pas lorsque le pilote graphique était cassé). Il était essentiel de pouvoir arrêter le code et passer au point où j'ai suspendu le matériel pour que je sache ce qui se passait.

Pour les problèmes purement logiciels, je trouve que réfléchir au problème et tester le système pour en savoir plus sur le problème est beaucoup plus utile que de parcourir le code ligne par ligne. Avec les instructions d'impression, j'ai une liste de tout ce qui s'est passé sur la ligne de commande ou le fichier journal que je peux regarder et reconstruire ce qui s'est passé, en allant en arrière et en avant plus facilement que jamais avec un débogueur.

Les bugs les plus difficiles sont généralement résolus en comprenant le problème loin de l'ordinateur. Parfois avec un morceau de papier ou un tableau blanc, et parfois la réponse se révèle pendant que je fais autre chose. Les bugs les plus délicats sont résolus en examinant attentivement le code, comme jouer à Where's Waldo. Tout le reste semble plus simple avec les instructions d'impression ou les instructions de journalisation.

Différentes personnes ont des styles différents et des styles différents conviennent mieux à différentes tâches. Les instructions d'impression ne sont pas nécessairement une étape vers le bas d'un débogueur. Selon ce que vous faites, ils peuvent même être meilleurs. Surtout dans une langue qui n'a pas de débogueur natif (Go?).

35
GlenPeterson

Certaines personnes utilisent gdb sur la ligne de commande, ou un plugin . Il existe également des interfaces graphiques autonomes pour gdb, comme DDD . Selon votre langue, il existe des interfaces graphiques de débogage autonomes spécifiques à la langue, comme Winpdb pour python, ou jswat pour Java. Parce que ces projets se concentrent uniquement sur le débogage, ils sont souvent supérieurs aux débogueurs intégrés.

L'autre petit secret sale sur les IDE est que tous valent leur sel vous permettent de spécifier un éditeur personnalisé, de sorte que vous pouvez utiliser des parties de IDE pour certaines tâches, mais utilisez un éditeur décent pour l'édition. Il n'est pas rare de lancer uniquement un IDE pour utiliser son débogueur, surtout si c'est ce que vos collègues utilisent tous.

10
Karl Bielefeldt

Certains langages offrent un REPL - c'est-à-dire que vous pouvez écrire et exécuter du code ligne par ligne au fur et à mesure que vous l'écrivez, ce qui peut être une première étape dans la vérification d'un morceau de code. Beaucoup d'entre eux offrent également fonctionnalités de débogage.Le GHC pour Haskell est livré avec GHCi qui peut être utilisé pour déboguer de manière interactive un programme dans la ligne de commande, comme le ferait un IDE.

6
CodexArcanum

Je ne comprends pas pourquoi il existe une aversion au débogage avec l'utilisation des instructions printf. Il fut un temps où il fallait trop de temps pour recompiler et lier un programme, mais aujourd'hui, cela ne prend que quelques secondes. Je trouve très facile de déboguer en utilisant le type de sortie cout, printf, qDebug (), etc. Les instructions Printf vous donnent un historique de tout ce que le programme a fait, que vous pouvez analyser après coup, tandis que l'exécution dans le débogueur vous oblige à vous souvenir manuellement du flux du programme pendant son exécution. Avec printf, vous pouvez convertir la valeur des variables en unités spécifiques, les afficher en hexadécimal, décimal, peu importe. Les instructions printf peuvent également répertorier les noms des routines et des variables, ainsi que les numéros de ligne. Vous ne pouvez lister que certains éléments du tableau en fonction d'autres variables. Vous pouvez suivre les indirections. Vous pouvez contrôler la sortie très facilement, mettre des compteurs, imprimer uniquement certaines fois à travers une boucle, ajouter et supprimer des instructions d'impression pendant le débogage, avoir différents niveaux de sortie de débogage, écrire dans des fichiers, etc. Il est beaucoup plus facile de voir l'historique de votre programme écrit dans un fichier que d'essayer de se souvenir de tous les endroits que vous avez parcourus manuellement, et peut-être d'avoir à écrire le contenu des variables au fil du temps, afin de découvrir ce que le programme a fait. Et enfin, avec les instructions printf, vous pouvez les laisser en permanence, pour les activer et les désactiver, pour un futur débogage.

2
Robert Felten

jimwise a répond la question très bien, mais j'ai pensé que je devrais ajouter que, si vous choisissez de travailler sans IDE complet, le débogueur de ligne de commande fourni par Microsoft s'appelle CDB . CDB est livré avec plusieurs autres outils, y compris WinDBG qui est l'équivalent GUI, lorsque vous téléchargez le SDK Windows.

2
Drew Marsh

Je n'utilise généralement pas de débogueur, peut-être une fois toutes les deux semaines, mais ce n'est pas la première chose à laquelle je vais.

L'outil le plus important dans mon travail est tellement omniprésent que j'ai presque oublié de le mentionner - les traces de pile. Plus de 90% des problèmes que je rencontre peuvent être résolus en examinant une trace de pile. Cet outil n'est pas toujours très utile en fonction de votre langue, mais lorsqu'il est bien implémenté par une langue, il peut vous faire gagner un temps incroyable.

Je suppose que la deuxième façon la plus courante de détecter des problèmes simples est que c'est probablement le code que je viens de changer. Je fais des tests unitaires assez souvent, donc je sais généralement ce que je viens de casser.

Pour un développement et un débogage plus complexes, je peux ajouter des instructions de journal de débogage ou de trace. Je considère les problèmes de développement comme un bon guide pour m'aider à placer les informations de journalisation de la trace de production/débogage, ce qui m'amène à:

Vous n'avez pas toujours un débogueur à portée de main. En production, il peut être impossible d'exécuter un débogueur (Heck, il peut être impossible d'accéder aux machines de production, sauf pour les journaux, selon la sécurité de votre entreprise). Il existe également des langages où connecter un débogueur prend trop de temps ou peut-être qu'il n'y a tout simplement pas de bons débogueurs disponibles.

Si vous avez toujours codé en utilisant la logique et la journalisation du niveau de débogage/trace, cela peut simplement être le cas d'examiner vos excellentes instructions de journal (éventuellement en augmentant le niveau de journal) pour comprendre le problème sans même accéder au matériel.

Bien que je pense que les débogueurs soient un outil puissant, ne les laissez pas être le seul outil dans votre boîte à outils!

2
Bill K

Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser le débogueur dans un IDE aux côtés d'un éditeur de texte autonome. J'avais l'habitude d'utiliser! Zap pour éditer, JBuilder pour déboguer sur une autre machine et un serveur de fichiers dans le Traditionnellement, les débogueurs étaient des programmes autonomes sans glisser le long d'un IDE, et cela fonctionne aussi.

Il convient de noter que des tests complets remplacent le débogage. Il vaut la peine de considérer un bogue signalé comme un bogue dans vos tests plutôt que dans votre code.

Il y a aussi printf. Il peut être utile de créer une grande quantité de "journalisation" et de la rechercher, plutôt que de s'arrêter pour chaque ligne. Je trouve particulièrement utile si vous pouvez modifier des classes de bibliothèque que vous ne pourriez pas modifier en production, par exemple en utilisant -Xbootclasspath/p: à pirater Java classes de bibliothèque.

1

Convenez que le meilleur des problèmes peut être résolu loin de l'ordinateur avec un stylo et du papier ou simplement en pensant au problème. C'est plus utile que d'utiliser des débogueurs en direct. Cela corrige souvent votre processus de réflexion.

Vous pouvez utiliser pudb qui est une console basée sur une interface utilisateur simple. Vous pouvez choisir votre débogueur préféré comme pdb ou ipdb si vous souhaitez entrer un REPL et l'examiner plus en détail.

Veuillez également consulter PythonDebuggingTools Wiki pour une collection plus complète d'outils disponibles.

1
Nishant