Comment déboguer sans IDE? [fermé]

61

Chaque fois que je cherche un IDE (actuellement, je bricole avec Go), je trouve un fil plein de gens qui recommandent Vi, Emacs, Notepad ++, 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 journalisation?

ConditionRacer
la source
53
Le débogage à l'ancienne du style printf pour autant que je sache :-)
Andrew Walters
25
Dans les jours précédant les IDE, nous utilisions des débogueurs attachés à un processus en cours d'exécution ou encapsulant le processus pour permettre la progression ou l'introspection de l'état du programme. (gdb, perl -d, etc ...) L'intégration des débogueurs dans les IDE le rend pratique, mais ils existent séparément. Échec des débogueurs, de la journalisation ... assurez-vous simplement que la journalisation ne modifie pas l'état du programme lors de sa reprise et réintroduisez le bogue que vous tentiez de trouver.
7
débogueur en ligne de commande (plusieurs débogueurs IDE sont basés sur eux)
freaket freak
14
Lentement et prudemment.
FrustratedWithFormsDesigner
3
Bien que les impressions soient assez courantes, son utilisation peut masquer certains bugs plus subtils tels que les conditions de compétition.
James

Réponses:

86

En utilisant un débogueur. Dans la plupart des cas, c’est aussi ce que fait une IDE en coulisse: elle 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 débogueurs Unix précédents tels que dbx.

Pour avoir une idée de ce à quoi ressemble le débogage depuis la ligne de commande, consultez le manuel de 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 beaucoup de souplesse et de possibilité de script. D'un autre côté, si vous êtes déjà à l'aise avec un éditeur tel que vim ou emacs, il est possible que votre éditeur favori dispose d'un plug-in pour votre débogueur préféré.

jimwise
la source
18
+1 pour "En utilisant un débogueur". Le je dans l'IDE signifie "intégré" :)
joshin4colours
1
Si vous écrivez en Python, pdbc'est en fait mieux que tout débogueur IDE que j'ai trouvé.
asthasr
1
@syrion Et ipdbvaut mieux que ça;)
Izkata
Excellent - Je ne savais pas que ça existait, Izkata. Merci.
asthasr
@ joshin4colours integrated! = collection, non?
Cole Johnson
35

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 par rapport au premier (car l'écran de l'ordinateur principal ne fonctionnait pas lorsque le pilote graphique était endommagé). Il était essentiel de pouvoir arrêter le code et aller au point de suspendre le matériel pour que je sache ce qui se passait.

Pour les problèmes purement logiciels, je trouve que penser 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 effectuant des va-et-vient plus facilement que je n'aurais jamais pu le faire 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 regardant attentivement le code, comme jouer à Where's Waldo. Tout le reste semble plus facile avec les instructions d'impression ou les instructions de journalisation.

Différentes personnes ont différents styles et différents styles conviennent mieux à différentes tâches. Les instructions à imprimer ne sont pas nécessairement une étape 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 (est-ce que Go?).

GlenPeterson
la source
7
Cette. Absolument ça. Je trouve que, du moins pour moi, les problèmes ont tendance à être des erreurs de logique ou des interactions qu'un débogueur ne rendrait pas plus apparentes. Vous devez comprendre pourquoi quelque chose ne va pas, pas seulement quoi .
Faux nom
2
+1 entièrement pour going backwards. J'ai souvent l'expérience: "Hey - waittaminute, ce n'est pas la bonne valeur! Comment est- ce devenu cela ?", Et je dois aller et venir dans la sortie tout en lisant le code. Les débogueurs sont mauvais à l’arrière.
Izkata
oui, gdb est bon pour examiner le noyau vidé, mais dans de telles situations, j’ai trouvé que l’utilisation gratuite de déclarations imprimées avait vraiment aidé.
Brian
Les débogueurs sont utiles mais éphémères. Avec un bon cadre de journalisation, je constate que je peux construire ma session de débogage. Utilisez le débogueur pour vous aider à comprendre la situation, complétez-le par des instructions print pour rendre la session de débogage permanente. Je trouve qu'avec le temps, je poursuis de moins en moins en procès le débogueur et deviens de plus en plus productif
Newtopian
Oui, le meilleur moyen de déboguer est de penser avec un morceau de papier ou un tableau blanc ou tout simplement dans votre esprit. Cela corrige souvent votre processus de réflexion. Le débogueur est parfois un moyen facile de sortir qui ne résoudra peut-être pas le problème initial de la raison pour laquelle des bogues surviennent dans votre programme :)
Nishant,
11

Certaines personnes utilisent gdb sur la ligne de commande ou un plugin . Il existe également des interfaces utilisateur autonomes à gdb, comme DDD . Selon votre langue, il existe des interfaces utilisateur graphiques spécifiques au langage pour le débogueur, telles que 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 sur les IDE vaut la peine de spécifier un éditeur personnalisé. Vous pouvez donc utiliser des parties de l'EDI pour certaines tâches, mais utilisez un éditeur correct pour l'édition. Il n'est pas rare de lancer un IDE pour utiliser son débogueur, surtout si c'est ce que tous vos collègues utilisent.

Karl Bielefeldt
la source
1
+1 L'autre option est bien sûr de définir les couleurs et les combinaisons de clés dans l'éditeur de l'EDI, et de faire semblant :)
darvids0n
1
@ darvids0n, j'utilise les IDE depuis plus de vingt ans et j'en ai encore à en trouver un avec un éditeur qui commence même à faire allusion à l'idée de penser peut-être qu'un jour, il pourrait être envisagé d'essayer de commencer à essayer tenez une bougie à GNU Emacs.
John R. Strohm
6

Certaines langues proposent un REPL, c’est-à-dire que vous pouvez écrire et exécuter du code ligne par ligne au fur et à mesure de son écriture, ce qui peut constituer une première étape dans la vérification d’un morceau de code. Beaucoup d'entre eux offrent également des installations de débogage. 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.

CodexArcanum
la source
2

Je ne comprends pas pourquoi il y a une aversion pour le débogage avec l'utilisation d'instructions printf. Il fut un temps où la recompilation et la liaison d'un programme prenaient trop de temps, mais aujourd'hui, cela ne prend que quelques secondes. Je trouve très facile de déboguer en utilisant cout, printf, qDebug (), etc. Les instructions Printf vous donnent un historique d'exécution de tout ce que le programme a fait, que vous pouvez analyser après coup, alors que l'exécution dans le débogueur vous oblige à vous souvenir manuellement du flux du programme en cours d'exécution. Avec printf, vous pouvez convertir la valeur des variables en unités spécifiques, les afficher en hexa, décimal, peu importe. Les instructions printf peuvent lister les noms des routines et des variables, ainsi que les numéros de ligne. Vous ne pouvez répertorier que certains éléments de tableau en fonction d'autres variables. Vous pouvez suivre des indirections. Vous pouvez contrôler la sortie très facilement, insérez des compteurs, imprimez seulement certaines heures par une boucle, ajoutez et supprimez des instructions d'impression à mesure que vous déboguez, disposez de niveaux de sortie de débogage différents, écrivez dans des fichiers, etc. Il est beaucoup plus facile de voir l'historique de votre programme écrit dans un fichier que de le faire. essayez de vous souvenir manuellement de tous les endroits que vous avez traversés, et peut-être devez é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 débogage ultérieur. C est beaucoup plus facile de voir l’historique de votre programme écrit dans un fichier que d’essayer de vous rappeler manuellement tous les endroits que vous avez traversés, et peut-être d’écrire le contenu des variables au fur et à mesure de leur évolution dans le temps, afin de découvrir 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 débogage ultérieur. C est beaucoup plus facile de voir l’historique de votre programme écrit dans un fichier que d’essayer de vous rappeler manuellement tous les endroits que vous avez traversés, et peut-être d’écrire le contenu des variables au fur et à mesure de leur évolution dans le temps, afin de découvrir 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 débogage ultérieur.

Robert Felten
la source
3
"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". Cela dépend de votre langue et de la taille du projet. Si je modifie un fichier d'en-tête dans mon projet actuel, il faudra environ 65 minutes pour reconstruire sur une machine à 32 processeurs avec 256 Go de RAM (je ne plaisante pas)
Nemanja Trifunovic
Les gens n'ont pas d'aversion pour le débogage avec des instructions d'impression, ils préfèrent simplement un débogueur. Je connais beaucoup plus de "personnes de printf" qui n'utilisent jamais de débogueurs que de "personnes de débogage" qui ne déboguent jamais à l'aide de printfs.
Karl Bielefeldt
1
Il est étonnamment difficile d'utiliser un débogueur pour un système suffisamment distribué, mais il est possible (avec quelques imprécisions en raison d'un problème de synchronisation d'horloge) de corréler les journaux. Si votre système logiciel est composé de fichiers binaires exécutés sur 100 machines différentes, il peut être plus facile de consigner les journaux / "débogage de printf" que d'utiliser des débogueurs et d'essayer de tout conserver dans une étape de verrouillage suffisante pour ne pas introduire d'autres problèmes.
Vatine
2

jimwise a très bien répondu à la question, mais j’ai pensé que je devrais ajouter que, si vous choisissez de travailler sans IDE complet, le débogueur en ligne de commande fourni par Microsoft pour Windows s’appelle CDB . CDB est fourni avec plusieurs autres outils, notamment WinDBG, l’équivalent de l’interface graphique, lorsque vous téléchargez le kit de développement logiciel (SDK) de Windows.

Drew Marsh
la source
4
Pourriez-vous expliquer plus en détail comment cela répond-il à la question posée?
moucher
Vous avez raison, en soi cela ne répond pas à la question. Je pensais que la réponse de @ jimwise était une bonne réponse à la question, mais n'incluais aucune information sur l'endroit où trouver un débogueur en ligne de commande pour Windows. Je me suis donc dit que je devrais utiliser une solution supplémentaire pour ceux qui rencontrent ce problème et se demandent comment le faire sous Windows. Je mettrai à jour ma réponse pour le dire autant.
Drew Marsh
2

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 de mon travail est tellement omniprésent que j'ai failli oublier 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. Selon votre langue, cet outil n’est pas toujours très utile, mais s’ils sont bien implémentés par une langue, ils peuvent vous faire gagner un temps fou.

La deuxième manière la plus courante de détecter des problèmes simples est probablement le code que je viens de modifier. 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 pourrais ajouter des instructions de journal de niveau 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 trace de production / de journalisation de débogage, ce qui me conduit à:

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 est également impossible d’accéder aux machines de production, à l’exception des journaux, en fonction de la sécurité de votre entreprise). Il y a aussi 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é à l'aide de la logique et de la journalisation au niveau de débogage / trace, vous pouvez simplement examiner vos excellentes instructions de journal (éventuellement augmenter le niveau de journalisation) pour résoudre le problème sans même accéder au matériel.

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

Bill K
la source
1

Il n'y a aucune raison pour que vous ne puissiez pas utiliser le débogueur dans un IDE avec un éditeur de texte autonome. J'utilisais auparavant! Zap pour éditer, JBuilder pour déboguer sur une autre machine et un serveur de fichiers au sous-sol. Les débogueurs étaient traditionnellement des programmes autonomes sans glisser d'un IDE, et cela fonctionne aussi.

Il convient de noter que des tests complets remplacent le débogage. Il est utile 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 d'effectuer une recherche à travers celle-ci, 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:pour pirater des classes de bibliothèque Java.

Tom Hawtin - tackline
la source
"Il est intéressant de noter que des tests complets déplacent le débogage." - Je dirais réduit, plutôt que "déplace". L'exécution de code par le biais d'un débogueur présente certains avantages, même lors de l'exécution de TDD - par exemple, lorsqu'un test fournit un résultat totalement inattendu, il peut être très utile de savoir exactement où cela s'est mal passé. de code que vous venez d'écrire, cela signifie que vous avez raté un cas de bord lors de vos tests précédents, mais cela arrive ...
Jules
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 réfléchissant au problème. Ceci 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é, tel que pdb ou ipdb, si vous souhaitez entrer un REPL et l'examiner plus en détail.

Consultez également le wiki de PythonDebuggingTools pour une collection plus complète d'outils disponibles.

Nishant
la source
La question initiale concernait Go, pas Python.
TMN
D'accord, ça m'a échappé. Il est apparu dans ma recherche lorsque je cherchais un débogueur Python.
Nishant