74 votes

Comment réparer un bug, vous ne pouvez pas répliquer?

La question, dit-il. Si vous avez un bug que plusieurs utilisateurs de rapport, mais il n'y a pas de dossier de, le bug se produisant dans le journal, ni le bug être répété, n'importe comment dur vous essayez, comment voulez-vous résoudre ce problème? Ou même le pouvez-vous?

Je suis sûr que cela est arrivé à beaucoup d'entre vous là-bas. Qu'avez-vous fait dans cette situation, et quel a été le résultat final?


Edit: Je suis plus intéressé à ce qui a été fait sur une introuvable bug, pas un insolubles bug. Insolubles bugs sont telles que vous avez au moins savoir qu'il y a un problème et qui ont un point de départ, dans la plupart des cas, pour la recherche. Dans le cas d'une introuvable, que faites-vous? Pouvez-vous même de faire quoi que ce soit?

87voto

Dave Jarvis Points 12598

Ceux-ci sont connus comme Heisenbugs.

Langue

Différents langages de programmation ont leur propre saveur de bugs.

C

L'ajout des instructions de débogage peut rendre le problème impossible de reproduire parce que le débogage de la déclaration des quarts de pointeurs (assez loin pour éviter une ERREUR de segmentation). Pointeur questions sont un cauchemar à suivre et à reproduire, mais il y a des débogueurs (tels que GDB et DDD) qui peuvent les aider.

Java

Une application qui a de multiples threads peut seulement montrer ses bugs avec un timing très précis ou une séquence d'événements. Une mauvaise simultanéité des implémentations peuvent provoquer des blocages dans des situations qui sont difficiles à reproduire.

JavaScript

Certains navigateurs web sont bien connus pour les fuites de mémoire. Code JavaScript qui s'exécute correctement dans un navigateur pourrait causer un mauvais comportement dans un autre navigateur. Utilisation de bibliothèques de tiers qui ont été rigoureusement testés par des milliers d'utilisateurs peut être avantageux d'éviter certains bogues obscures.

Environnement

Selon la complexité de l'environnement dans lequel l'application (qui a le bug) est en cours d'exécution, le seul recours qu'il pourrait être de simplifier l'environnement. L'exécution de l'application:

  • sur un serveur?
  • sur un ordinateur de bureau?
  • dans un navigateur web?

Dans quel environnement l'application produisent le problème?

  • le développement?
  • test?
  • la production?

Sortie applications superflues, tuer des tâches en arrière-plan, arrêter tous les événements programmés (tâches cron), supprimer les plug-ins et désinstaller le navigateur add-ons.

Mise en réseau

Comme le réseautage est essentiel pour de nombreuses applications:

  • Assurer la stabilité des connexions réseau, y compris les signaux sans fil.
  • Le logiciel le reconnecter après des pannes de réseau robuste?
  • Faire toutes les connexions être fermés de façon à libérer de la mémoire?
  • Sont des gens à l'aide de la machine qui ne devrait pas l'être?
  • Sont des dispositifs non autorisés à interagir avec la machine du réseau?
  • Existe-il des usines ou des tours radio de proximité qui peuvent causer des interférences?
  • Faire des tailles de paquets et la fréquence chute à l'intérieur nominal des plages?
  • Sont tous les appareils en réseau adéquat lourd pour une utilisation de la bande passante?

La cohérence

Éliminer autant d'inconnues que possible:

  • Isoler les composants architecturaux.
  • Supprimer les non-essentiels, ou éventuellement problématiques (en conflit), des éléments.
  • Désactiver les différents modules de l'application.

Supprimer toutes les différences entre la production, de test et de développement. Utilisez le même matériel. Suivre les mêmes étapes, parfaitement, installation d'ordinateurs. La cohérence est la clé.

La journalisation

L'utilisation de quantités libérale de la journalisation de corréler les événements en temps passé. Examiner les journaux pour les erreurs évidentes, des problèmes de timing, etc.

Matériel

Si le logiciel semble bien, considérons des défauts du matériel:

  • Sont la physique des connexions réseau solide?
  • Sont là tout les câbles lâches?
  • Sont frites assis correctement?
  • Faire tous les câbles sont propres connexions?
  • Est l'environnement de travail propre et exempt de poussière?
  • Cachée des dispositifs ou des câbles été endommagée par des rongeurs ou des insectes?
  • Existe-il des blocs défectueux sur les disques?
  • Sont les ventilateurs de CPU de travail?
  • Peut à la carte mère, l'alimentation de tous les composants? (PROCESSEUR, carte réseau, carte vidéo, disques, etc.)
  • Pourrait interférences électromagnétiques être le coupable?

Ce qui se passe lorsque vous exécutez l'application en local (c'est à dire, pas à travers le réseau)? D'autres serveurs qui connaissent les mêmes problèmes? Est la base de données à distance? Pouvez-vous utiliser une base de données locale?

Firmware

Entre le matériel et le logiciel firmware.

  • Est le BIOS de l'ordinateur à jour?
  • Est la pile du BIOS de travail?
  • Sont le BIOS de l'horloge et l'horloge système de la synchronisation?

De temps et de Statistiques

Les problèmes de synchronisation sont difficiles à suivre:

  • Lorsque le problème survient-il?
  • À quelle fréquence?
  • Ce que d'autres systèmes sont en cours d'exécution à l'époque?
  • L'application est sensible au temps (par exemple, va bondir jours ou des secondes intercalaires provoquer des problèmes)?

Recueillir dur des données numériques sur le problème. Un problème qui pourrait, au premier abord, sembler aléatoire, pourrait en fait avoir un motif.

La Gestion Du Changement

Parfois, des problèmes apparaissent après une mise à niveau du système.

  • Quand le problème a d'abord commencer?
  • Ce qui a changé dans l'environnement (matériel et logiciel)?
  • Ce qui se passe après la restauration d'une version précédente?
  • Quelles différences existent entre la problématique de la version et de la bonne version?

Gestion De La Bibliothèque

Systèmes d'exploitation différents ont différentes façons de distribuer contradictoires bibliothèques:

  • Windows a l'Enfer des DLL.
  • Unix peut avoir de nombreux rompu les liens symboliques.
  • Java fichiers de la bibliothèque peut être tout aussi difficiles à résoudre.

Effectuer une nouvelle installation du système d'exploitation, et ne comprennent que le logiciel de prise en charge requis pour votre application.

Java

Assurez-vous que chaque bibliothèque est utilisée qu'une seule fois. Parfois, l'application des conteneurs ont une autre version de la bibliothèque de l'application elle-même. Cela pourrait ne pas être possible de reproduire dans l'environnement de développement.

Utiliser une bibliothèque de gestion des outils comme Maven ou de Lierre.

Débogage

Le Code d'une méthode de détection qui déclenche une notification (par exemple, journaux, e-mail, pop-up, pager bip) quand le bug se produit. L'utilisation de tests automatisés pour soumettre des données dans l'application. L'utilisation des données aléatoires. L'utilisation de données qui couvre connus et éventuels cas de bord. Finalement, le bug devrait réapparaître.

Le sommeil

Il est bon de répéter ce que d'autres ont mentionné: le sommeil. Passer du temps loin de la problème de, terminer d'autres tâches (comme la documentation). Être physiquement éloignés à partir d'ordinateurs et de faire de l'exercice.

L'Examen Du Code

Promenade à travers le code, ligne par ligne, et de décrire ce que chaque ligne ne pour vous-même, un collègue, ou un canard en caoutchouc. Cela peut conduire à des idées sur la façon de reproduire le bug.

Le Rayonnement Cosmique

Les Rayons cosmiques peuvent flip bits. Ce n'est pas aussi grand comme un problème dans le passé en raison de moderne la vérification des erreurs de mémoire. Logiciel pour le matériel que feuilles, de la Terre de protection est soumis à des problèmes qui ne peut pas être reproduite en raison du caractère aléatoire du rayonnement cosmique.

14voto

Brian Agnew Points 143181

Si c'est un GUI application, c'est inestimable pour regarder le client générer l'erreur (ou d'essayer). Ils vont sans doute être faire quelque chose que vous n'auriez jamais deviné qu'ils étaient en train de faire (pas tort, juste différemment).

Sinon, se concentrer votre journalisation dans ce domaine. Journal de la plupart de tout (vous pouvez sortir plus tard) et d'obtenir votre application pour vider son environnement. par exemple, le type de machine, VM type de codage utilisé.

Est-ce que votre app signaler un numéro de version, le numéro de version, etc.? Vous avez besoin de cela pour déterminer précisément la version à laquelle vous êtes débogage (ou pas!).

Si vous pouvez instrument de votre application (par exemple en utilisant JMX si vous êtes dans le monde Java), puis instrument de la zone en question. Magasin de stats par exemple les demandes de paramètres, le temps, etc. Utiliser des tampons pour stocker les n derniers requêtes/réponses/objet versions/whatever, et dump eux lorsque l'utilisateur signale un problème.

10voto

Karl Anderson Points 1187

Si vous ne pouvez pas reproduire, vous pouvez le corriger, mais ne pouvez pas savoir que vous l'avez résolu.

J'ai fait de mon mieux explication sur la façon dont le problème a été déclenché (même si je ne savais pas comment la situation pourrait se), fixe, et fait en sorte que si le bug a refait surface, nos mécanismes de notification de laisser un futur développeur connaître les choses que je souhaite que j'avais connu. En pratique, cela signifie l'ajout du journal des événements lorsque les chemins qui pourraient déclencher le bug ont été croisés, et les mesures pour les ressources connexes ont été enregistrées. Et, bien sûr, faire en sorte que les tests exercé le code bien en général.

Décider de ce que les notifications à ajouter, c'est un de faisabilité et de triage question. Donc, est de décider combien de développeur de temps à passer sur le bug en premier lieu. Il ne peut pas être répondu sans savoir comment important est le bogue.

J'ai eu de bons résultats (à ne pas montrer de nouveau, et le code était mieux pour elle), et le mauvais (passé trop de temps à ne pas résoudre le problème, si le bug a fini fixe ou pas). C'est ce que des estimations et émettre des priorités pour les.

8voto

David Points 1862

Parfois, j'ai juste à s'asseoir et d'étudier le code jusqu'à ce que j'ai trouver le bug. Essayer de prouver que le bug est impossible, et dans le processus, vous pouvez savoir où vous pourriez être trompé. Si vous avez réellement réussir à vous convaincre que c'est impossible, supposons que vous foiré quelque part.

Il peut être utile d'ajouter un tas de vérification des erreurs et des affirmations de confirmer ou d'infirmer vos croyances et hypothèses. Quelque chose peut échouer que vous n'auriez jamais attendre.

4voto

Dinah Points 15711

Demander à mon dernier boss. Il semblait être convaincu que j'étais censé être en mesure de fixer non reproductibles bugs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X