Si vous codez en C, Objective-C ou C ++, vous pouvez utiliser CLang Static Analyzer pour critiquer votre source sans l'exécuter.
Certains outils de débogage de mémoire sont disponibles: ValGrind, Guard Malloc sur Mac OS X, Electric Fence sur * NIX.
Certains environnements de développement offrent la possibilité d’utiliser un allocateur de mémoire de débogage qui remplit des tâches telles que le remplissage des pages nouvellement allouées et libérées, la détection de la libération des pointeurs non alloués et l’écriture de certaines données avant et après chaque bloc appelé si le modèle connu de ces données change jamais.
Un gars de Slashdot a déclaré qu'il tirait beaucoup de profit d'une nouvelle source de données à débogage unique dans un débogueur. "C'est ça" dit-il. Je ne suis pas toujours ses conseils, mais ceux-ci m'ont été très utiles. Même si vous n'avez pas de scénario de test stimulant un chemin de code peu commun, vous pouvez modifier une variable de votre débogueur pour prendre de tels chemins, en allouant de la mémoire, puis en utilisant le débogueur pour définir votre nouveau pointeur sur NULL au lieu du paramètre. adresse de mémoire, puis en passant par le gestionnaire d’échec d’allocation.
Utilisez des assertions - la macro assert () en C, C ++ et Objective-C. Si votre langue ne fournit pas de fonction d'assertion, écrivez-en une vous-même.
Utilisez des assertions généreusement, puis laissez-les dans votre code. J'appelle assert () "Le test qui continue à tester". Je les utilise le plus souvent pour vérifier les conditions préalables au point d'entrée de la plupart de mes fonctions. C'est une partie de "Programmation par contrat", qui est intégrée au langage de programmation Eiffel. L’autre partie concerne postconditions, c’est-à-dire assert () à des points de retour de fonction, mais j’aperçois que je n’en retire pas autant de kilométrage que de conditions préalables.
Vous pouvez également utiliser assert pour vérifier les invariants de classe. Bien qu'aucune classe ne soit strictement requise pour avoir un invariant, les classes les plus judicieusement conçues les ont. Un invariant de classe est une condition toujours vraie autre que celle contenue dans les fonctions membres pouvant placer temporairement votre objet dans un état incohérent. De telles fonctions doivent toujours restaurer la cohérence avant leur retour.
Ainsi, chaque fonction membre peut vérifier l'invariant à l'entrée et à la sortie et la classe peut définir une fonction appelée CheckInvariant que tout autre code pourrait appeler à tout moment.
Utilisez un outil de couverture de code pour vérifier quelles lignes de votre source sont effectivement testées, puis concevez des tests qui stimulent les lignes non testées. Par exemple, vous pouvez vérifier les gestionnaires de mémoire insuffisante en exécutant votre application dans une machine virtuelle configurée avec peu de mémoire physique et sans fichier d'échange, ni très petit.
(Pour une raison quelconque, je n'étais jamais au courant, alors que BeOS pouvait fonctionner sans fichier d'échange, il était extrêmement instable de cette façon. Dominic Giampaolo, qui a écrit le système de fichiers BFS, m'a exhorté à ne jamais exécuter le BeOS sans échange. Je ne voyez pourquoi cela devrait être important, mais il doit s'agir d'une sorte d'artefact d'implémentation.)
Vous devez également tester la réponse de votre code aux erreurs d'E / S. Essayez de stocker tous vos fichiers sur un partage réseau, puis débranchez votre câble réseau pendant que votre application a une charge de travail élevée. De même, débranchez le câble - ou éteignez votre réseau sans fil - si vous communiquez sur un réseau.
Les sites Web qui ne disposent pas de code Javascript robuste sont particulièrement irritants. Les pages de Facebook chargent des dizaines de petits fichiers Javascript, mais si l'un d'entre eux ne parvient pas à télécharger, la page entière se brise. Il doit simplement exister un moyen de fournir une certaine tolérance aux pannes, par exemple en réessayant un téléchargement, ou de fournir une sorte de solution de secours raisonnable lorsque certains de vos scripts ne se sont pas téléchargés.
Essayez de tuer votre application avec le débogueur ou avec "kill -9" sur * NIX alors qu'il est en train d'écrire un gros fichier important. Si votre application est bien architecturée, l'intégralité du fichier sera écrit ou ne sera pas écrit du tout, ou peut-être s'il n'est que partiellement écrit, ce qui sera écrit ne sera pas corrompu, avec quelles données sauvegardées seront complètement utilisables par l'application lors de la relecture du fichier.
les bases de données ont toujours des E / S de disque tolérantes aux pannes, mais pratiquement aucun autre type d'application ne le fait. Bien que les systèmes de fichiers journalisés empêchent la corruption du système de fichiers en cas de panne de courant ou de panne, ils ne font rien du tout pour empêcher la corruption ou la perte des données de l'utilisateur final. C’est la responsabilité des applications utilisateur, mais pratiquement aucune autre base de données que la base de données n’implémente la tolérance aux pannes.