6
votes

Comment savoir quelle adresse illégale l'accès au programme lorsqu'une faute de segmentation se produit

plus, le programme fonctionne sur un périphérique ARM exécutant Linux, je peux imprimer des informations sur la pile et enregistrer les valeurs dans le gestionnaire SIG-SEG que j'ignite. Le problème est que je ne peux pas ajouter l'option -g au fichier source, car le bogue peut ne pas se reproduire en raison de la rétrograde de la performance.


1 commentaires

Au moins avec GCC, vous pouvez ajouter -g sans optimisation invalidante. Et sur les cibles elfe, GCC met les informations de débogage dans des sections séparées, de sorte qu'elles ne seront même pas chargées de disque avant la nécessité.


6 Réponses :


1
votes

1 commentaires

Info-> Si_addr est l'adresse de mémoire défectueuse. Comme indiqué dans le lien que vous avez fourni, l'adresse au moment où le signal a été soulevé peut être récupéré à partir de VOID * PTR . Voir ma réponse ici pour le code que j'ai utilisé avec bras - Stackoverflow.com/questions/77005/...



3
votes

J'ai tendance à utiliser Valgrind qui indique les fuites et défaut d'accès à la mémoire . .


2 commentaires

Valgrind est pour X86, AMD64 et PPC - le questionneur est en cours d'exécution sur le bras. Cependant, je suis agréablement surpris de lire que le soutien des bras est en cours.


@Crazyscot J'ai effectivement raté la partie "bras" de la question. Mais heureux de savoir que Valgrind est sur le point de soutenir cette architecture;)



15
votes

Compilation avec l'option -g à gcc est pas cause une "rétrograde de performance". Tout ce que cela fait, c'est que les symboles de débogage soient inclus; Il ne pas affecte l'optimisation ou la génération de code.

Si vous installez votre SIGSEGV HANDER utilisant le membre SA_SIGRACTION MEMBRE DU SIGRACTION STRIT transmis sur Sigaction () , alors le membre Si_addr de la structure siginfo_t transmis à votre gestionnaire contient l'adresse défectueuse.


1 commentaires

J'ai eu des problèmes dans lesquels un segfault causé par écrit à un pointeur non initialisé est apparu et a disparu en fonction de la question de savoir si j'ai utilisé -g, ou ce que je l'avais. Cela a à voir avec quelle mémoire est l'endroit où. De même, je l'ai eu lorsque l'ajout ou la suppression d'un Printf a apporté l'erreur apparaissent. Les segfault en C peuvent être des bâtards Wily.



1
votes

Si vous craignez d'utiliser -g sur le binaire sur le binaire que vous chargez sur l'appareil, vous pourrez peut-être utiliser Gdfserver sur le périphérique ARM avec une version dépouillée de l'exécutable et d'exécuter ARM-GDB sur votre machine de développement avec le version non entrée de l'exécutable. La version dénudée et la version non entrée doivent correspondre à ce que ce soit pour le faire, c'est ainsi que cela:

# You may add your own optimization flags
arm-gcc -g program.c -o program.debug 
arm-strip --strip-debug program.debug -o program
# or
arm-strip --strip-unneeded program.debug -o program


0 commentaires

1
votes

Vous pouvez également utiliser la fonction BackTrace () si disponible, qui fournira la pile d'appels au moment de la crash. Cela peut être utilisé afin de jeter la pile comme il se produit dans un langage de programmation de haut niveau lorsqu'un programme C obtient une erreur de segmentation, une erreur de bus ou une autre erreur de violation de la mémoire.

Backtrace () est disponible sur Linux et Mac OS X


0 commentaires

0
votes

Si l'option -g rend l'erreur disparaître, alors savoir où il se bloque qu'il est peu probable d'être utile de toute façon. Il écrit probablement à un pointeur ininitialisé en fonction de la fonction A, puis de fonctionner B Titre de la légitimement utilise cette mémoire et meurt. Les erreurs de mémoire sont une douleur.


0 commentaires