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. p>
6 Réponses :
Cela semble fonctionner
http://tlug.up.ac.za/wiki/index.php/ Obtention_a_stack_trace_in_c_upon_sigsegv
Info-> Si_addr code> 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 code>. Voir ma réponse ici pour le code que j'ai utilisé avec bras - Stackoverflow.com/questions/77005/...
J'ai tendance à utiliser Valgrind code> qui indique les fuites et défaut d'accès à la mémoire em>. p>.
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;)
Compilation avec l'option Si vous installez votre -g code> à
gcc code> est pas em> cause une "rétrograde de performance". Tout ce que cela fait, c'est que les symboles de débogage soient inclus; Il ne pas em> affecte l'optimisation ou la génération de code. P>
SIGSEGV CODE> HANDER utilisant le membre
SA_SIGRACTION CODE> MEMBRE DU
SIGRACTION CODE> STRIT transmis sur
Sigaction () Code> , alors le membre
Si_addr code> de la structure
siginfo_t code> transmis à votre gestionnaire contient l'adresse défectueuse. P>
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.
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
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. P>
Backtrace () est disponible sur Linux et Mac OS X P>
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. P>
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é.