Articles

Que faire avec un défaut de segmentation 11

Pour une raison quelconque, j’ai décidé de construire un produit en utilisant du C simple. Si l’objectif était l’efficacité du code, ce fut un désastre. Mais en tant qu’outil de croissance personnelle, je pense que j’ai appris beaucoup plus sur la programmation au cours du processus.

Par exemple, je sais maintenant plus précisément pourquoi un dictionnaire python et une liste se comportent différemment, et ce que signifie vraiment « passer par référence. »

Cependant, s’il y avait une barrière qui me ferait ne jamais vouloir revenir à C, ce serait la redoutée « Faille de segmentation 11 », suivie de près par « Piège d’abandon 6. »

Ces deux erreurs se produisent pendant l’exécution, ce qui les rend difficiles à déboguer. XCode, Eclipse ou d’autres outils de débogage sont vraiment utiles, mais j’ai appris qu’il est beaucoup plus important d’apprendre ce que sont ces choses et de proposer des procédures pour aborder le processus de débogage. Ce ne sont que mes notes sur mes propres erreurs courantes. J’espère en faire une liste de dépannage pour tous ceux qui ont leurs propres problèmes. Je veux au moins couvrir mes problèmes stupides, afin que vous puissiez vous concentrer sur de vrais problèmes de codage.

Un défaut de segmentation signifie que votre programme a essayé d’accéder à quelque chose qu’il n’était pas censé faire. Ça fait partie du problème. Il y a plusieurs raisons pour lesquelles un programme peut accéder à des choses qui ne sont pas censées le faire, mais le code compilé dit à peu près simplement « #@#@^*&! » plutôt. Si vous y réfléchissez, vous ne voudriez pas avoir à expliquer à quelqu’un pourquoi le fait de vous piquer dans un endroit sensible vous rend fou. Tu veux juste qu’ils arrêtent de le faire. Heureusement, les ordinateurs sont à la fois stupides et étonnamment patients après environ 75 ans d’ingénierie. Ils continueront à envoyer des fautes de segmentation, mais (généralement) n’arrêteront pas d’être amis après que cela se produise la 1000e fois.

Qu’est-ce qu’un piège à abandon ?

Ce n’est pas si différent. Quelque part, votre ordinateur s’est dit d’abandonner le programme. Encore une fois, pas très utile. Cependant, cela se produit généralement lorsque vous essayez de faire quelque chose comme accéder à string d’une chaîne de deux caractères "nw" ou ne parvenez pas à allouer suffisamment de mémoire char string pour une chaîne ou un tableau comme "way".

Que devez-vous faire avec un défaut Seg ?

Les tutoriels que j’ai lus ont tendance à se concentrer sur l’utilisation d’outils de débogage tels que lldb, gdb, etc. Tout va bien et dandy. Oui, vous devez d’abord exécuter gcc -g, puis lldb executable_name, puis run -flag1 -flag2 pour voir si cela vous aide à le comprendre. Mais parfois, il n’y a aucune aide. J’ai une liste de choses à vérifier cependant.

  • Vérifiez que vos variables globales de programme nécessaires ont des valeurs. Cela s’est principalement produit parce que j’avais créé des drapeaux qui remplissaient un tas de valeurs qui devaient être définies avant de s’exécuter. Cependant, que se passe-t-il s’ils ne mettent rien dedans? Faute de Seg 11! Il y a eu un certain nombre de fois où j’ai * pensé * que les variables étaient définies alors qu’elles ne l’étaient pas, ce qui a créé des bugs difficiles. Mieux encore, essayez de limiter les totaux afin qu’ils soient plus faciles à suivre.
  • malloc est à la fois votre ami et votre ennemi. En particulier avec les entrées utilisateur, il peut être très difficile d’allouer de la mémoire, puis de copier, de concaténer et de faire tout ce qui reste sur la route. Connaissez bien cette commande et comment cela fonctionne. Et n’oubliez pas de free()la mémoire lorsque vous avez terminé!
  • utilisez char var pour déterminer la taille d’un caractère* pour l’allocation de mémoire. La plupart du problème que j’avais consistait à assigner des variables pour éventuellement accepter une chaîne. J’ai vu d’autres conseils, mais si c’est une chaîne avec laquelle vous travaillez, je pense que strlen() fonctionnait le plus régulièrement. Vous avez besoin du +1 pour que \0 (null) termine la chaîne à la fin.
  • utilisez int arr) +1)] pour les tableaux d’autres types. C’est une façon étrange de faire les choses, mais c’est ce que vous obtenez avec un langage de bas niveau.
  • \0 représente null et termine un tableau. Cela peut être utile lorsque vous essayez d’éviter les problèmes de débordement de tampon.
  • Essayez d’utiliser autant que possible des constantes définies. Chaque fois que vous êtes en mesure de définir des choses lors de la précompilation, cela vous fera gagner du temps de débogage plus tard.
  • Comprendre à quoi servent les fichiers d’en-tête. De nombreux tutoriels vous diront ce que contient un fichier d’en-tête, mais ce n’est pas toujours clair à quoi ils servent. Les fichiers d’en-tête sont capturés au moment de la pré-compilation et fournissent un résumé des variables et des fonctions disponibles pour le programme* avant sa compilation*. Cela signifie que le.les fichiers c inclus dans le programme pourront accéder à ces fonctions, à condition que #include <headerfile.h> soit ajouté au fichier. Une bonne convention est de créer un.fichier h chaque fois que vous créez un.
  • La plupart des boucles for vont comme ceci: for (int i=0; i < stop; i++)Un moyen facile d’avoir un piège d’abandon est de mettre un ≤ devant stop.
  • Gardez vos problèmes contenus. Essayez de faire en sorte que chaque fichier fasse quelques choses discrètes et rien d’autre. Si vous devez parcourir différents fichiers, cela peut rendre la recherche de vos problèmes de défaut seg très difficile.
  • Les calculs informatiques sont difficiles. Ce n’est pas vraiment le cas, mais les petites choses causent de gros problèmes. char variable par exemple signifie un tableau contenant deux éléments, mais comme les index commencent à 0, cela signifie que vous ne pouvez aller qu’au numéro 1.
  • Imprimez les chaînes de format comme le bon type. Heureusement, cela est généralement pris au moment de la compilation, mais cela peut toujours poser des problèmes. Assurez-vous que votre caractère de format %{whatever} convient à la variable que vous souhaitez y mettre.

C’est tout ce que j’ai pour l’instant. J’espère que mes misères vous ont sauvé quelques maux de tête sur la route! Si tout le reste échoue, j’ai maintenant une liste de choses à vérifier avant de me tirer les cheveux!