De bonnes stratégies pour faire face à des bogues «non reproductibles»?

Très souvent, vous obtiendrez ou soumettrez des rapports de bogue pour les défauts «non reproductibles». Ils peuvent être reproductibles sur votre ordinateur ou votre projet logiciel, mais pas sur le système d’un fournisseur. Ou l’utilisateur fournit des étapes pour reproduire, mais vous ne pouvez pas voir le défaut localement. Beaucoup de variations sur ce scénario bien sûr, donc pour simplifier, je suppose que ce que j’essaie d’apprendre, c’est:

Quelle est la politique de votre entreprise vis-à-vis des bogues «non reproductibles»? Douze eux, fermez-les, ignorez? Il m’arrive de voir des bogues intermittents et non reproductibles dans les systèmes tiers, et ceux-ci sont presque toujours fermés instantanément par le fournisseur … mais ce sont de vrais bogues.

Avez-vous trouvé des techniques qui aident à corriger ces types de bogues? En général, je demande à l’utilisateur de générer un rapport d’informations sur le système et de reproduire les étapes, puis de rechercher des mots-clés et d’essayer de voir un modèle.

  • Vérifier les étapes utilisées pour générer l’erreur

Souvent, les personnes signalant l’erreur ou les personnes reproduisant l’erreur commettent des erreurs et ne se retrouvent pas dans le même état, même si elles le croient. Essayez de le parcourir avec le déclarant. J’ai eu un utilisateur INSIST que les privilèges d’administrateur n’apparaissaient pas correctement. J’ai essayé de reproduire l’erreur et je n’ai pas pu. Lorsque nous l’avons parcouru ensemble, il s’est avéré qu’il se connectait en tant qu’utilisateur régulier dans ce cas.

  • Vérifier le système / environnement utilisé pour générer l’erreur

J’ai trouvé beaucoup de bogues «irrécupérables» et j’ai découvert plus tard qu’ils SONT reproductibles sur Mac OS (10.4). Exécution de la version X de Safari. Et cela ne s’applique pas seulement aux navigateurs et au rendu, cela peut s’appliquer à n’importe quoi; les autres applications en cours d’exécution, que l’utilisateur soit ou non RDP ou local, administrateur ou utilisateur, etc. Assurez-vous que votre environnement est aussi proche que possible du leur avant de l’appeler irrécupérable.

  • Recueillir des captures d’écran et des journaux

Une fois que vous avez vérifié que l’utilisateur fait tout correctement et continue à recevoir un bogue, et que vous faites exactement ce qu’il fait, et que vous ne recevez PAS le bogue, il est temps de voir ce que vous pouvez faire à ce sujet. Les captures d’écran et les journaux sont essentiels. Vous voulez savoir exactement à quoi ça ressemble, et exactement ce qui se passait à l’époque.

Il est possible que les journaux contiennent certaines informations que vous pouvez reproduire sur votre système, et une fois que vous pourrez reproduire le scénario exact, vous pourrez peut-être extraire l’erreur du masquage.

Les captures d’écran vous aident également car vous pourriez découvrir que “X piece s’est chargé correctement, mais cela ne devrait pas être le cas car il dépend de Y” et cela pourrait vous donner un indice. Même si l’utilisateur peut décrire ce qu’il faisait, une capture d’écran pourrait aider encore plus.

  • Recueillez la description étape par étape de l’utilisateur

Il est très courant de blâmer les utilisateurs et de ne pas faire confiance à tout ce qu’ils disent (parce qu’ils appellent un «usercontrol» un «truc»), mais même s’ils ne connaissent pas le nom de ce qu’ils voient, ils pourront toujours Décrivez certains des comportements qu’ils voient. Cela inclut quelques erreurs mineures qui peuvent s’être produites quelques minutes AVANT que la véritable erreur ne se soit produite, ou peut-être une lenteur dans certaines choses qui sont généralement rapides. Toutes ces choses peuvent être des indices pour vous aider à déterminer quel aspect est à l’origine de l’erreur sur leur machine et non sur la vôtre.

  • Essayez d’autres approches pour générer l’erreur

Si tout échoue, essayez de regarder la section du code qui pose problème et éventuellement de refactoriser ou d’utiliser une solution de contournement. S’il vous est possible de créer un scénario dans lequel vous commencez avec la moitié des informations déjà présentes (dans l’UAT, espérons-le), demandez à l’utilisateur d’essayer cette approche et de voir si l’erreur persiste. Faites-vous de votre mieux pour créer des approches alternatives, mais similaires, qui amènent l’erreur à un niveau différent, afin que vous puissiez mieux l’examiner.

Rapports d’erreurs, fichiers journaux et demandes sévères à “Contactez-moi immédiatement si cela se reproduit”.

Si cela se produit dans un contexte et non dans un autre, nous essayons d’énumérer la différence entre les deux et de les éliminer.

Parfois, cela fonctionne (par exemple, autre matériel, dual core vs hyperthreading, disque dur portable vs disque de poste de travail, …).

Parfois ça ne marche pas. Si c’est possible, nous pouvons commencer le débogage à distance. Si cela ne vous aide pas, nous pouvons essayer de mettre la main sur le système du client.

Mais bien sûr, nous n’écrivons pas trop de bugs en premier lieu 🙂

Réponse courte: Procédez à une révision détaillée du code sur le code défectueux suspecté, dans le but de corriger tout bogue théorique, et en ajoutant du code pour surveiller et consigner les éventuels défauts futurs.

Réponse longue: Donner un exemple concret du monde des systèmes embarqués: nous fabriquons des équipements indussortingels contenant des composants électroniques personnalisés et des logiciels intégrés.

Un client a signalé qu’un certain nombre d’appareils sur un même site rencontraient le même défaut à des intervalles aléatoires. Leurs symptômes étaient les mêmes dans chaque cas, mais ils ne pouvaient pas identifier une cause évidente.

Évidemment, notre première étape a été d’essayer de reproduire la panne dans le même appareil dans notre laboratoire, mais nous n’avons pas pu le faire.

Ainsi, au lieu de cela, nous avons fait circuler le code présumé défectueux au sein du service, pour essayer d’obtenir autant d’idées et de suggestions que possible. Nous avons ensuite tenu un certain nombre de réunions de révision du code pour discuter de ces idées et déterminer une théorie qui: (a) expliquait la cause la plus probable des défauts observés sur le terrain; (b) expliqué pourquoi nous n’avons pas pu le reproduire; et (c) conduit à des améliorations que nous pourrions apporter au code pour éviter que la faute ne se reproduise à l’avenir.

En plus des correctifs (théoriques), nous avons également ajouté un code de surveillance et de journalisation. Par conséquent, si l’erreur se reproduisait, nous pourrions extraire des données utiles du périphérique en question.

À ma connaissance, ce logiciel amélioré a par la suite été déployé sur site et semble avoir été un succès.

résolu “stérile” et “fantasmagorique”

Nous avons deux catégories de bogues fermés pour cette situation.

stérile – ne peut pas se reproduire.

fantasmagorique – il est reconnu qu’il y a un problème, mais il apparaît simplement par intermittence, n’est pas tout à fait compréhensible et donne à chacun un léger cas de la chair de poule.

Eh bien, vous faites de votre mieux pour le reproduire, et si vous ne le pouvez pas, vous réfléchissez longuement et réfléchissez à la façon dont un tel problème pourrait survenir. Si vous n’en avez toujours aucune idée, alors vous ne pouvez pas faire grand chose.

Certaines des nouvelles fonctionnalités de Visual Studio 2010 vous aideront. Voir:

  • Historique des parsings de débogueur et de test de test dans Visual Studio Team System 2010
  • Meilleure qualité logicielle avec Visual Studio Team System 2010
  • Test manuel avec Visual Studio Team System 2010

J’ajoute la journalisation au code de gestion des exceptions tout au long du programme. Vous avez besoin d’une méthode pour collecter les journaux (les utilisateurs peuvent l’envoyer par courrier électronique, etc.)

Les vérifications préventives pour les versions de code et les environnements sains sont également une bonne chose. Avec la facilité des mises à jour logicielles de nos jours, le code et l’environnement que l’utilisateur exécute n’ont presque certainement pas été testés. Il n’existait pas lorsque vous avez publié votre code.

Avec un projet web que je développe en ce moment, je fais quelque chose de très similaire à votre technique. Je construis une page sur laquelle je peux diriger les utilisateurs afin de collecter des informations telles que la version de leur navigateur et le système d’exploitation. Je vais également collecter les informations de registre des applications afin que je puisse voir ce qu’ils ont fait.

C’est un problème très réel. Je ne peux parler que pour le développement Web, mais je trouve que les utilisateurs sont rarement en mesure de me donner les informations de base dont j’ai besoin pour examiner le problème. Je pense qu’il est tout à fait possible de faire quelque chose de similaire avec d’autres types de développement. Mon plan est de continuer à travailler sur ce système pour le rendre de plus en plus utile.

Mais ma politique est de ne jamais fermer un bug simplement parce que je ne peux pas le reproduire, même si cela peut être ennuyant. Et puis il y a les cas où ce n’est pas un bogue, mais l’utilisateur s’est tout simplement trompé. Ce qui est un autre type de bug, je suppose, mais tout aussi important.

Vous parlez de problèmes reproductibles mais seulement sur certains systèmes. Ce sont faciles à manipuler:

Première étape: En utilisant une sorte de logiciel distant, vous laissez le client vous dire quoi faire pour reproduire le problème sur le système qui l’a. Si ceci échoue, fermez-le.

Deuxième étape: essayez de reproduire le problème sur un autre système. Si cela échoue, faites une copie exacte du système client.

Troisième étape: si cela échoue encore, vous n’avez pas d’autre choix que d’essayer de le déboguer sur le système client.

Une fois que vous pouvez le reproduire, vous pouvez le réparer. Peu importe le système.

La question délicate est vraiment des problèmes non reproductibles, c’est-à-dire des choses qui ne se produisent que par intermittence. Pour cela, je vais devoir faire la queue avec les rapports, les journaux et les exigences sévères. 🙂

Parfois, le bogue n’est pas reproductible même dans un environnement de préproduction qui est la réplique exacte de l’environnement de production. Les problèmes de concurrence sont notoires pour cela.

La raison peut être simplement due à l’effet Heisenberg, c’est-à-dire que l’observation modifie le comportement. Une autre raison peut être que les chances d’atteindre la combinaison d’événements qui déclenchent le bogue sont très faibles.

Parfois, vous avez de la chance et vous avez des journaux d’audit que vous pouvez lire, ce qui augmente considérablement les chances de recréer le problème. Vous pouvez également insister sur l’environnement avec de gros volumes de transactions. Cela compresse efficacement le temps de sorte que si le bogue survient, disons une fois par semaine, vous pourrez peut-être le reproduire de manière fiable en 1 jour si vous insistez sur le fait que le système 7 X soit chargé.

Le dernier recours est le test de la boîte blanche où vous passez par la ligne de code par ligne en écrivant des tests unitaires au fur et à mesure.

L’enregistrement est votre ami!

Généralement, ce qui se passe lorsque nous découvrons un bogue que nous ne pouvons pas reproduire, c’est que nous demandons au client d’activer davantage de journalisation (s’il est disponible) ou que nous publions une version avec journalisation supplémentaire dans la zone qui nous intéresse. la journalisation que nous avons est excellente et a la capacité d’être très verbeuse, et la publication de versions avec une journalisation supplémentaire ne se produit pas souvent.

Vous devriez également envisager l’utilisation de vidages de mémoire (dont IMO relève également de la journalisation). Produire un minidump est si rapide que cela peut généralement être fait sur des serveurs de production, même sous charge (tant que le nombre de dumps produits est faible).

La façon dont je le vois: être capable de reproduire un problème est bien parce que cela vous donne un environnement où vous pouvez déboguer, expérimenter et jouer plus librement, mais – la reproduction d’un bogue n’est en aucun cas essentielle pour le déboguer ! Si le bogue ne survient que sur un autre système, vous devez tout de même diagnostiquer et déboguer le problème de la même manière, mais il vous faut simplement savoir comment procéder.

Il est important de classer ces bogues (rarement reproductibles) et d’agir différemment de ceux qui sont souvent reproductibles sur la base d’actions utilisateur spécifiques.

  1. Description claire du problème et étapes à suivre pour reproduire et observer le comportement : Un rapport sans ambiguïté permet à l’équipe entière de comprendre le problème en éliminant les conclusions erronées. Par exemple, un écran vide de rapport utilisateur est différent du gel IHM lors d’une action utilisateur. La séquence des étapes et le calendrier approximatif des actions de l’utilisateur sont également importants. L’utilisateur a-t-il immédiatement sélectionné l’option après la transition de l’écran ou attendu quelques minutes? Un bug intéressant concernant la synchronisation est une voiture allergique à la glace à la vanille qui a déconcerté les ingénieurs automobiles.

  2. Configuration du système et parameters de démarrage : Parfois, même la configuration matérielle et la version du logiciel d’application (y compris les pilotes et la version du micrologiciel) peuvent faire un tour ou deux. Une incompatibilité de version ou de configuration peut entraîner des problèmes difficiles à reproduire dans d’autres configurations. Ce sont donc des détails essentiels à saisir. La plupart des outils de rapport de bogue ont ces détails comme parameters obligatoires à signaler lors de la journalisation d’un problème.

  3. Consignation extensive : Cela dépend des installations de journalisation suivies dans les projets concernés. Lorsque vous travaillez avec des systèmes Linux embarqués, nous fournissons non seulement des journaux de diagnostic généraux, mais également des journaux de niveau système tels que dmesg ou les journaux de commandes supérieurs. Vous ne saurez peut-être jamais que la mauvaise partie n’est pas le stream de code mais l’utilisation anormale de la mémoire / l’utilisation du processeur. Identifiez le type de problème et notifiez les journaux pertinents pour enquête.

  4. Revues de code et visite guidée: Les équipes de développeurs ne peuvent pas attendre éternellement pour reproduire ces problèmes à leur fin, puis prendre des mesures. Le rapport de bogue et les journaux disponibles doivent être examinés et diverses possibilités peuvent être identifiées sur cette base à partir de la conception et du code. Si nécessaire, ils doivent préparer le correctif sur les causes possibles et faire circuler le correctif parmi les équipes, y compris le testeur qui l’a identifié pour voir si le bogue est reproductible avec lui.

  5. Ne fermez pas ces problèmes en fonction de l’observation d’un seul testeur / d’une équipe après l’identification et la vérification d’un correctif : la partie la plus importante est peut-être l’approche suivie pour résoudre ces problèmes. Une fois le problème résolu, toutes les équipes de test / validation situées à différents endroits doivent en être informées pour effectuer des tests intensifs et identifier les erreurs de régression, le cas échéant. Seuls tous (pratiquement tous) d’entre eux déclarent qu’ils ne sont pas reproductibles, une évaluation de la fermeture doit être effectuée par la direction.

S’il n’est pas reproduit, obtenez des journaux, des captures d’écran des étapes exactes à reproduire.

Il y a une nouvelle fonctionnalité intéressante dans Windows 7 qui permet à l’utilisateur d’enregistrer ce qu’il fait et d’envoyer un rapport – il apparaît en tant que document avec des captures d’écran de chaque étape. J’espère que cela aidera dans le cas où l’utilisateur interagit avec l’application dans un ordre auquel le développeur ne penserait pas. J’ai vu beaucoup de bogues où la manière logique d’utiliser l’application de la part du développeur ne correspond pas à la manière dont les utilisateurs le font réellement, ce qui entraîne beaucoup d’erreurs subtiles.

La réponse acceptée est la meilleure approche générale. À un niveau élevé, il est important de mesurer l’importance de corriger le bogue par rapport à ce que vous pourriez append en tant que fonctionnalité ou amélioration qui serait bénéfique pour l’utilisateur. Un bug «non reproductible» pourrait-il prendre deux jours à corriger? Une fonctionnalité pourrait-elle être ajoutée à ce moment-là, ce qui donnerait aux utilisateurs plus d’avantages que ce correctif de bogue? Peut-être que les utilisateurs préféreraient la fonctionnalité. J’ai été parfois obsédé par les développeurs en tant que développeur, puis les utilisateurs sont invités à faire part de leurs commentaires et aucun d’entre eux ne mentionne le ou les bogues que je peux voir, mais le logiciel manque une fonctionnalité qu’il souhaite vraiment. !

Parfois, la persistance simple à essayer de reproduire le bogue pendant le débogage peut être l’approche la plus efficace. Pour que cette stratégie fonctionne, le bug doit être «intermittent» plutôt que complètement «non reproductible». Si vous pouvez répéter un bug même une fois sur 10 et que vous avez des idées sur l’endroit le plus probable, vous pouvez placer des points d’arrêt sur ces points, puis essayer de répéter le bug et voir exactement ce qui se passe. J’ai constaté que cela était plus efficace que de se connecter à un ou deux cas (bien que la journalisation soit mon premier contact en général).