Y a-t-il de bonnes stratégies pour traiter les bogues "non reproductibles"?
très souvent, vous obtenez ou soumettez des rapports de bogue pour des défauts qui ne sont pas "reproductibles". Ils peuvent être reproductibles sur votre ordinateur ou votre projet de logiciel, mais pas sur le système d'un vendeur. 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 est:
Quelle est la Politique de votre entreprise à l'égard des bogues "non reproductibles"? Les laisser tomber, les fermer, les ignorer? Je l'occasion de voir bugs intermittents, non reproductibles dans les cadres de partie 3-rd, et ceux-ci sont presque toujours fermés instantanément par le vendeur... mais ce sont de vrais insectes.
avez-vous trouvé des techniques qui aident à corriger ces types de bogues? Habituellement, ce que je fais est d'obtenir un rapport d'information de système de l'utilisateur, et les étapes pour reproduire, puis la recherche sur les mots-clés, et essayer de voir toute sorte de modèle.
16 réponses
- Vérifier les étapes utilisées pour produire l'erreur
souvent, les gens qui signalent l'erreur, ou ceux qui la reproduisent, font quelque chose de mal et ne finissent pas dans le même état, même s'ils pensent le faire. Essayez de le faire avec la partie qui rapporte. J'ai demandé à un utilisateur D'insister sur le fait que les privilèges d'administrateur n'apparaissaient pas correctement. J'ai essayé de reproduire l'erreur et n'a pas pu. Quand nous l'avons traversé ensemble, il s'est avéré qu'il se connectait en tant qu'Utilisateur régulier dans ce cas.
- à Vérifier que le système/environnement utilisé pour produire l'erreur
j'ai trouvé beaucoup de bugs 'irremplaçables' et seulement plus tard j'ai découvert qu'ils sont reproductibles sur Mac OS (10.4) en tournant 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 qui sont actuellement en cours d'exécution, que l'utilisateur soit RDP ou local, administrateur ou utilisateur, etc... Assurez-vous d'obtenir votre environnement le plus près possible du leur avant de le qualifier d'irremplaçable.
- de Recueillir des Captures d'écran et les Journaux
une fois que vous avez vérifié que l'utilisateur fait tout correctement et qu'il reçoit toujours un bug, et que vous faites exactement ce qu'il fait, et que vous ne recevez pas le bug, alors il est temps de voir ce que vous pouvez réellement faire à ce sujet. Des captures d'écran et les fichiers journaux sont critiques. Vous voulez savoir exactement ce qu'il ressemble, et exactement ce qui se passait à l'époque.
il est possible que les journaux contiennent des informations que vous pouvez reproduire sur votre système, et une fois que vous pouvez reproduire le scénario exact, vous pourriez être en mesure de faire sortir l'erreur de la dissimulation.
Screenshots aussi aider avec cela, parce que vous pourriez découvrir que "X piece a chargé correctement, mais il ne devrait pas avoir parce qu'il dépend de Y" et cela pourrait vous donner un indice. Même si l'utilisateur peut décrire qu'est-ce qui se passe, un screen shot pourrait aider encore plus.
- recueillir 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 "contrôle des utilisateurs" un "truc"), mais même s'ils ne connaissent pas les noms de ce qu'ils voient, ils seront toujours en mesure de décrire certains des comportements qu'ils voient. Cela inclut certaines erreurs mineures qui peuvent avoir eu lieu quelques minutes Avant l'erreur réelle s'est produite, ou peut-être la lenteur dans certaines choses qui sont généralement rapide. Toutes ces choses peuvent être des indices pour vous aider à préciser quel aspect est à l'origine de l'erreur sur leur machine et pas le vôtre.
- Essayer d'autres Approches pour produire l'erreur
si tout le reste échoue, essayez de regarder la section de code qui cause des problèmes, et peut-être refactoriser ou utiliser une solution de contournement. S'il vous est possible de créer un scénario où vous commencez avec la moitié des informations déjà là (espérons dans UAT) demander à l'utilisateur d'essayer cette approche, et voir si l'erreur se produit toujours. Faites-vous le mieux pour créer des approches alternatives mais similaires qui obtiennent l'erreur dans une lumière différente afin que vous puissiez l'examiner mieux.
rapport D'erreur, fichiers journaux, et stern exige de " me contacter immédiatement si cela se reproduit."
Si cela se produit dans un contexte et pas 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, laptop-disk vs. workstation disk, ...).
parfois non. Si c'est possible, nous pouvons commencer à déboguer à distance. Si cela n'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 bogues dans le premier lieu :)
brève réponse: effectuer un examen détaillé du code sur le code fautif présumé, dans le but de corriger tout bogue théorique, et ajouter du code pour surveiller et enregistrer toute défaillance future.
réponse: Pour donner un exemple concret du monde des systèmes embarqués: nous fabriquons des équipements industriels, contenant de l'électronique personnalisée, et des logiciels embarqués qui fonctionnent avec.
un client a déclaré qu'un certain nombre d'appareils sur un seul site étaient l'expérience de la même faute à des intervalles aléatoires. Leurs symptômes étaient les mêmes dans chaque cas, mais ils n'ont pas pu identifier une cause évidente.
Évidemment, notre première étape a été d'essayer de reproduire le problème dans le même appareil, dans notre laboratoire, mais nous avons été incapables de le faire.
donc, nous avons plutôt fait circuler le code fautif présumé au sein du ministère, 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) expliquait pourquoi nous n'étions pas en mesure de la reproduire; et (c) conduisait à des améliorations que nous pourrions apporter au code pour empêcher la faute se produire à l'avenir.
en plus des corrections de bug (théoriques), nous avons aussi ajouté du code de surveillance et de journalisation, donc si la défaillance devait se produire à nouveau, nous pourrions extraire des données utiles de l'appareil en question.
au meilleur de ma connaissance, ce logiciel amélioré a par la suite été déployé sur place et semble avoir donné de bons résultats.
résolu "stérile" et "effrayant"
nous avons deux catégories de bogues fermées pour cette situation.
stériles - ne peuvent pas se reproduire.
spooky - il est reconnu qu'il y a un problème, mais il semble juste intermittent, n'est pas tout à fait compréhensible, et donne à tout le monde un faible cas des creeps.
Eh bien, vous faites de votre mieux pour le reproduire, et si vous ne pouvez pas, vous prenez beaucoup de temps à réfléchir et à considérer comment un tel problème pourrait se poser. Si vous n'en avez pas la moindre idée, il n'y a pas grand-chose que vous puissiez faire.
Certaines des nouvelles fonctionnalités de Visual Studio 2010. Voir:
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 envoyer par mail, 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 ces jours-ci le code et l'environnement que l'utilisateur exécute n'a presque certainement pas été testé. Il n'existait pas quand 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 vers laquelle je peux diriger les utilisateurs afin de recueillir des informations telles que leur version de navigateur et le système d'exploitation. Je vais également collecter les informations du registre des applications afin de pouvoir jeter un oeil à ce qu'ils ont fait.
C'est un vrai problème. 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 que je voudrais besoin de se pencher sur la question. 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 afin de le rendre plus utile.
mais ma politique est de ne jamais fermer un bug simplement parce que je ne peux pas le reproduire, peu importe à quel point il peut être ennuyeux. Et puis il y a les cas où ce n'est pas un bug, mais l'utilisateur est simplement devenu confus. Ce qui est un autre type de bogue, je suppose, mais tout aussi important.
Vous parler des problèmes qui sont reproductibles, mais seulement sur certains systèmes. Ils sont faciles à manipuler:
Première étape: En utilisant une sorte de logiciel de la télécommande, vous permettre de vous dire quoi faire pour reproduire le problème sur le système. Si cela échoue, puis fermez-le.
Deuxième étape: Essayer de reproduire le problème sur un autre système. Si cela échoue, faire une copie exacte du système.
troisième étape: si elle échoue toujours, vous n'avez pas option que d'essayer de le corriger sur le système client.
une Fois que vous pouvez le reproduire, vous pouvez le fixer. N'a pas d'importance sur ce système.
les sujets délicats sont vraiment des sujets non reproductibles, c'est-à-dire des choses qui ne se produisent que de façon intermittente. Pour ça, je vais devoir suivre les rapports, les rapports et l'attitude de la poupe. :)
Parfois, le bug n'est pas reproductible, même dans un environnement de pré-production qui est la copie exacte de l'environnement de production. Les questions de concurrence sont notoires à cet égard.
la raison peut être simplement due à L'effet Heisenberg, c'est-à-dire que l'observation modifie le comportement. Une autre raison peut être parce que les chances sont très faibles de frapper la combinaison d'événements qui déclenche le bogue.
parfois vous êtes chanceux et vous avez des journaux d'audit que vous pouvez playback, ce qui augmente considérablement les chances de recréer le problème. Vous pouvez également stressez l'environnement avec des volumes élevés de transactions. Cela comprime efficacement le temps de sorte que si le bogue se produit disons une fois par semaine, vous pouvez être en mesure de reproduire de manière fiable en 1 jour si vous stressez le système à 7 X la charge de production.
le dernier recours est le test de whitebox où vous allez à travers la ligne de code par les essais de l'unité d'écriture de ligne que vous allez.
Journalisation est votre ami!
généralement ce qui se passe quand nous découvrons un bug que nous ne pouvons pas reproduire est soit que nous demandons au client d'activer plus de journalisation (si elle est disponible), soit que nous publions une version avec journalisation supplémentaire ajoutée autour de la zone qui nous intéresse. En général, la journalisation que nous avons est excellente et a la capacité d'être très verbeuse, et donc la publication de versions avec journalisation supplémentaire ne se produit pas souvent.
vous devriez également considérer l'utilisation de vidages de mémoire (OMI tombe également sous le parapluie de l'exploitation forestière). La production d'une mini-pompe est si rapide qu'elle peut généralement être réalisée sur des serveurs de production, même en charge (à condition que le nombre de dumps produits soit faible).
La façon dont je vois les choses: Être capable de reproduire un problème, c'est agréable car il vous donne un environnement où vous pouvez déboguer, expérimente et de jouer plus librement, mais - reproduire un bug n'est en aucun cas essentiel pour le déboguer! Si l' bug se passe seulement sur quelqu'un d'autre système alors vous devez toujours diagnostiquer et déboguer le problème de la même manière, c'est juste que cette fois vous devez être plus astucieux sur la façon dont vous le faites.
il est important de catégoriser ces bogues (rarement reproductibles) et d'agir sur eux différemment des bogues qui sont souvent reproductibles basé sur des actions spécifiques de l'utilisateur.
une description claire de la question ainsi que des étapes pour reproduire et observer le comportement: un rapport sans ambiguïté aide à la compréhension de la question par toute l'équipe en éliminant les conclusions erronées. Par exemple, l'écran blanc de rapport de l'utilisateur est différent du gel de L'IHM sur l'action de l'utilisateur. Séquence d'étapes et env calendrier de l'action de l'utilisateur est également important.L'utilisateur a immédiatement sélectionnez l'option après l'écran de transition ou de attendu quelques minutes? Un bug intéressant concernant le timing est une voiture allergique à la crème glacée à la vanille qui a déconcerté les ingénieurs automobiles.
paramètres de configuration et de démarrage du système: 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. L'inadéquation de la version ou de la configuration peut entraîner des problèmes difficiles à reproduire dans d'autres configurations. Il s'agit donc de détails essentiels à saisir. La plupart des outils de rapport de bogue ont ces détails comme paramètres obligatoires à signaler lors de la journalisation d'un problème.
Exploitation Forestière Extensive: cela dépend des installations d'exploitation forestière suivies dans les projets concernés. Tout en travaillant avec des systèmes Linux embarqués, nous ne fournissons pas seulement des journaux de diagnostic général, mais aussi les journaux au niveau du système comme dmesg ou les journaux de commande haut. Vous ne pouvez jamais savoir que la mauvaise partie n'est pas le flux de code mais l'utilisation anormale de la Mémoire/utilisation CPU. Déterminez le type de problème et signalez les registres pertinents aux fins d'enquête.
critiques de Code et visite: les équipes de développement ne peuvent pas attendre indéfiniment pour reproduire ces problèmes à leur fin et ensuite prendre des mesures. Le rapport de bogue et les journaux disponibles devraient être étudiés et diverses possibilités devraient être identifiées à ce sujet. base de la conception et du code. Si nécessaire, ils devraient préparer hotfix sur les causes profondes possibles et faire circuler le hotfix parmi les équipes, y compris le testeur qui l'a identifié pour voir si bug est reproductible avec elle.
ne fermez pas ces problèmes sur la base de l'observation d'un seul testeur/équipe après qu'un correctif ait été identifié et vérifié: la partie peut-être la plus importante est l'approche suivie pour clore ces questions. Une fois que la solution de ces problèmes a été vérifiée, tous les équipes d'essai et de validation situées à différents endroits devraient être informées des résultats des essais intensifs et, le cas échéant, des erreurs de régression. Seuls la totalité (pratiquement la plupart) d'entre eux déclarent qu'ils ne sont pas reproductibles, une évaluation de la fermeture doit être effectuée par la haute direction.
si elle n'est pas reproductible obtenir des journaux, des captures d'écran des étapes exactes de reproduire.
il y a une nouvelle fonctionnalité agréable dans Windows 7 qui permet à l'utilisateur d'enregistrer ce qu'il fait et ensuite envoyer un rapport - il est livré comme un doc avec des captures d'écran de chaque étape. Avec un peu de chance, cela aidera dans les cas où c'est l'utilisateur qui interagit avec l'application dans un ordre auquel le développeur ne penserait pas. J'ai vu beaucoup de bugs où il est juste un cas que la façon logique du développeur de l'utilisation de l'application ne correspond pas à la façon dont les utilisateurs finaux le font réellement... résultant en beaucoup de subtile erreur.
la réponse acceptée est la meilleure approche générale. À un niveau élevé, il est intéressant de soupeser l'importance de corriger le bogue par rapport à ce que vous pourriez ajouter comme fonctionnalité ou améliorer qui profiterait à l'utilisateur. Un bogue "non reproductible" pourrait-il prendre deux jours à corriger? Pourrait-on ajouter dans ce temps une fonctionnalité qui offre aux utilisateurs plus d'avantages que cette correction de bogue? Peut-être que les utilisateurs préféreraient cette fonctionnalité. J'ai parfois été fixé en tant que développeur sur les imperfections que je peux voir, et puis les utilisateurs sont invités à faire part de leurs commentaires et aucun d'entre eux mentionnent le bug(s) que je peux voir, mais le logiciel est en manque une fonctionnalité qu'ils veulent vraiment!
parfois, la simple persistance dans la tentative de reproduire le bug 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 où il se produit, vous pouvez placer des points de rupture à ces points tentent alors avec obstination de répéter le bug et de voir exactement ce qui se passe. J'ai vécu cela de plus efficace que la journalisation dans un ou deux cas (bien que la connexion serait mon premier choix en général).