Est-il possible de savoir où votre programme s'interrompt si une erreur de segmentation (core dumped) se produit dans votre programme en utilisant le terminal Unix avec le compilateur clang ++?

Est-il possible de savoir où votre programme s'interrompt si une erreur de segmentation (core dumped) se produit dans votre programme en utilisant le terminal Unix avec le compilateur clang ++?

Antonio Nesic, développeur principal de logiciels chez AVL

Pas avec un compilateur, mais il existe de bons outils tels que GDB (débogueur), Valgrind (analyseur statique) et xxd (éditeur hexadécimal) qui peuvent vous aider à trouver votre bogue.

Mais aussi un bon point de départ serait de regarder les mallocs en C.

Nous avons eu un problème similaire lorsque nous nous attendions à des fichiers d'une certaine taille, mais sans compter que dans le futur nous aurons un fichier plus grand que malloc.

Qu'est-il arrivé -> erreur de segmentation

Une fois que vous avez trouvé l'endroit, vous pouvez le patcher.

Richard Conto, Programmeur en plusieurs langues. Débogueur encore plus
Répondu le 25 janvier 2018 · L’auteur a 3,5k réponses et 3m répond aux vues

Compiler avec les métadonnées de débogage activées (généralement l'indicateur "-g" sur les compilateurs C - consultez la documentation de votre compilateur).

Cela laissera "gdb" (ou d'autres débogueurs comme "ups") en savoir plus sur ce qui se passe.

Mais vous aurez besoin des éléments suivants:

Le core dump (les systèmes Linux peuvent être configurés pour placer des core dumps dans des endroits éloignés. Drat!)

L'exécutable qui correspond au fichier core

Le code source qui correspond à l'exécutable.

Si vous pouvez répéter les conditions qui ont provoqué le vidage de la mémoire, vous pouvez essayer d'exécuter le programme sous le débogueur jusqu'à ce qu'il se bloque et éviter d'avoir à utiliser le core dump, mais cela pourrait également créer un bogue différent.

Notez que la compilation avec les symboles de débogage activés peut affecter l’optimisation du code - et cela peut également changer l’endroit où se trouve le fichier de base.

Fred Mitchell, Je connais Ruby, Rust, Python, Haskell, C ++, Erlang, etc.
Répondu le 25 janvier 2018 · L’auteur a 766 réponses et 894k réponses vues

Familiarisez-vous avec gdb. Assurez-vous que votre code est compilé en mode débogage afin qu'il contienne toutes les références à la table des symboles que gdb peut exploiter.

Si vous utilisez Emacs, il a des capacités gdb pour faciliter la définition de points d'arrêt dans votre code en utilisant la source comme référence.

Gdb est ton ami.

Ivan Pizhenko, Senior Software Engineer, plus de 15 ans d'expérience en développement logiciel
Réponse donnée le 26 janvier 2018 · L’auteur a 391 réponses et 110.8k répond aux vues

Oui, s'il génère coredump, vous pouvez l'ouvrir dans un débogueur comme gdb et voir une trace de pile. Si le programme a été compilé avec les informations de débogage, vous verrez également les noms et les lignes des fichiers de code source.

Travis Casey, MS in Comp Sci; Unix admin enseigné des systèmes d'exploitation à FSU
Répondu le 28 janvier 2018 · L’auteur a 5k réponses et 1.4m répond aux questions

Si vous ne disposez pas d'un débogueur ou d'un autre outil pour vous aider, vous pouvez utiliser la méthode originale: insérer une déclaration qui imprimera un message du type "Fait le checkpoint 1" sur le terminal. Insérez ensuite des points de contrôle jusqu'à ce que vous trouviez le point où l'erreur se produit.

Segmentation Fault, Unix, Compilers, C (langage de programmation), Langages de programmation, Programmation informatique