Pourquoi le débogage inversé est-il rarement utilisé? [fermé]


57

gdb a mis en place un support pour le débogage inversé en 2009 (avec gdb 7.0). Je n'en ai jamais entendu parler avant 2012. Maintenant, je le trouve extrêmement utile pour certains types de problèmes de débogage. J'aurais aimé en avoir entendu parler auparavant.

Corrigez-moi si je me trompe, mais j’ai l’impression que la technique est encore rarement utilisée et que la plupart des gens ne savent pas qu’elle existe. Pourquoi?

Connaissez-vous des communautés de programmation où l'utilisation du débogage inversé est courante?

Informations d'arrière-plan:


47
Pour le bénéfice de ceux qui ne le savent pas, qu'est - ce que le débogage inversé?
Mason Wheeler

5
MS a appelé son système intellitrace, qui semble être semblable à ce que vous appelez le débogage revese, il peut s’agir de noms multiples, selon l’environnement, ce qui le rend moins utilisé.
Ryathal

1
Juste pour ce que cela vaut: il est vraiment beaucoup plus vieux que vous ne le croyez - Microsoft le supportait dans QuickC (autour de 1989 ou 90, si ma mémoire est bonne).
Jerry Coffin

41
@MasonWheeler, le débogage inverse est clairement l'acte d'ajouter des bogues au code. Je ne suis pas d'accord avec la prémisse du PO, selon laquelle il s'agit d'une pratique peu commune.
Ben Lee

3
@ BenLee, nous appelons cela rebugging.
OldFart

Réponses:


27

D'une part, fonctionner en mode débogage avec enregistrement est très coûteux par rapport au mode de débogage même normal; il consomme également beaucoup plus de mémoire.

Il est plus facile de diminuer la granularité du niveau de ligne au niveau d'appel de fonction. Par exemple, le débogueur standard dans eclipse vous permet de "passer à l’image", ce qui est essentiellement un retour au début de la fonction avec une réinitialisation de tous les paramètres (rien de fait sur le tas n'est annulé et les finallyblocs ne sont pas exécutés). , ce n’est donc pas un vrai débogueur inversé (faites attention à cela).

Notez que cette solution est disponible depuis plusieurs années et fonctionne de pair avec le remplacement du code à chaud.


1
Très bonne réponse. Je peux confirmer que l'enregistrement coûte cher. Vous devez l'activer juste avant d'entrer dans la partie critique de votre application, qui n'est pas toujours anodine. Je conviens également que "drop to frame" est souvent suffisant. Cela ne fonctionne pas bien avec les boucles ou les algorithmes récursifs, cependant.
Philipp Claßen

3
C'est jusqu'à rr ( rr-project.org ). la vitesse lors de l'enregistrement d'une exécution à l'aide de rr est à peine plus lente. Vous pouvez ensuite rejouer, intervenir, revenir en arrière , définir des observateurs dans votre IDE préféré ( github.com/mozilla/rr/wiki/Using-rr-in-an-IDE ) ... ... la façon dont vous déboguez votre code ne sera jamais la même.
jyavenard

11

Comme mentionné précédemment, les performances sont essentielles, par exemple avec le débogage réversible de gdb. Si vous exécutez quelque chose comme gzip, vous constaterez un ralentissement de 50 000 fois par rapport à une exécution native. Il existe toutefois des alternatives commerciales: je travaille pour Undo undo.io et notre produit UndoDB fait de même, mais avec un ralentissement inférieur à 2x. Il existe également d'autres débogueurs réversibles commerciaux.


1
Intéressant, je vais certainement essayer. Dans plusieurs articles, il est indiqué qu'il est gratuit pour une utilisation non commerciale, mais je n'ai trouvé aucune information confirmant cela sur votre page d'accueil. Est-ce toujours vrai? Merci d'avoir révélé votre affiliation.
Philipp Claßen

2
Quels sont les prix des versions Starter et Professional de UndoDB? Je ne les vois pas sur la page des éditions UndoDB.
Tcrosley

3
Comment vous comparez-vous à Mozilla rr?
Ciro Santilli a annoncé le 09/09/17

10

Pour une vue d'ensemble des choix et produits technologiques, voir une série de billets de blog que j'ai écrits il y a environ un an (et quelques suivis depuis):

Mon sentiment que je l’utilise si peu, c’est que cela nécessite un matériel spécial, l’utilisation d’un débogueur spécial ou la configuration de votre système. La plupart des gens n'investissent malheureusement pas le temps nécessaire pour tirer le meilleur parti de leurs outils de débogage.

Et le fait que le "défaut par défaut" de gdb est presque exceptionnellement lent et pose quelques problèmes de stabilité pour tout sauf les systèmes cibles les plus courants.


4

D'après mon expérience en tant qu'ingénieur commercial pour le débogueur TotalView, les utilisateurs savent qu'il existe mais ne pensent pas que cela fonctionne, quel que soit le ralentissement (acceptable ou non).

L’Université de Cambridge a récemment mené une enquête intitulée "L’échec à adopter des coûts de débogage inversé coûte 41 milliards de dollars par an à l’économie mondiale" .

Et pour revenir à GDB, j’ai souvent entendu dire que le ralentissement le rend tout à fait inutilisable avec une application "réelle".

Personnellement, j'aimerais beaucoup avoir plus de gens qui utilisent le débogage inverse sur des applications autres que "Hello world!"


4
Je pense qu'il serait de loin préférable de lier cette étude plutôt que de "Annuler le logiciel" comme prétendant être une étude.
Bulwersator

1
À mon ancien poste, je travaillais à la création d'un débogueur inversé ( ghs.com/products/timemachine.html ). Nous avons beaucoup utilisé le débogueur en interne et je peux vous dire que c’était incroyable. C’était bien sur des conditions de course très difficiles, mais c’était plus que ça. Lorsque le débogage inversé est activé en permanence, votre mentalité concernant le débogage change. Vous itérez moins et vous pouvez faire moins attention à la façon dont vous testez votre code. Vous pouvez également enregistrer une exécution et l'envoyer à quelqu'un, ce qui en fait un excellent moyen de rechercher des bogues dans le code d'autres personnes.
Avion rapide

2

Je pense qu'il est important de développer un peu plus ce débogage "inverse" ou "historique". Je pense que pour comprendre les systèmes complexes et le comportement dans ceux-ci, il est absolument crucial de rejouer les "événements" qui rendent l'état explicite.

Ce que je veux dire, c'est que vous n'êtes pas seul à vous demander pourquoi cette technique n'est pas tellement appliquée aujourd'hui ou pourquoi les problèmes connexes sont rarement discutés clairement.

Soulignons donc ici deux concepts très importants:

1.Pour comprendre un système de programmation, il est utile de rendre explicite l'état

2.Pour comprendre encore plus, un système de programmation rejouant des séquences d’états (événements) peut beaucoup aider.

Voici quelques sources qui ont abordé le problème et proposé ou conçu des solutions au problème (traitement de l'état dans des systèmes complexes):

-Out of the bit bit, paper: http://shaffner.us/cs/papers/tarpit.pdf Idées principales: éviter, isoler ou rendre explicite l'état

-CQRS http://www.cqrs.nu/ C'est une combinaison de deux concepts: Ségrégation de requêtes de commandes et Sourcing d'événements. Il existe différentes implémentations (Java, C #, Scala). La répétition des séquences de Tate et l'évolution d'un modèle de domaine sont les éléments cruciaux de cette étape.

Si vous vraiment en zoom et de voir l'image très large , vous pouvez déjà voir que la « montée » des personnes de programmation fonctionnelle sont déjà ((un) consciemment) attirés par fp parce qu'il fait état explicite! Mais cela ne concerne que le premier point. Pour aborder le second, vous avez besoin d’un autre concept qui pourrait être décrit de manière "approximative" comme une programmation réactive fonctionnelle.

Vous pouvez donc dire que tout va bien, mais qui utilise réellement CQRS et FRP? Je dirais (OMI parce que je n'ai pas de chiffres concrets) en fait beaucoup d'entreprises, c'est juste qu'elles ne savent pas que leur travail utilise cette terminologie. Peut-être que vous google un peu et que vous entendez des entreprises qui utilisent CQRS, il y a déjà des histoires de réussite. Par exemple, le format FRP augmente lentement. Je pourrais donner à Netflix: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html qui vient de publier une implémentation de RX qui est en réalité basée sur .NET (mais a une implémentation Javascript aussi). Donc, les gens utilisent déjà ces techniques aujourd'hui, dans le grand pour comprendre les systèmes complexes et les rendre encore meilleurs. C'est pourquoi ils utilisent des techniques de débogage inverse.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.