2011-08-15 2 views
1

j'ai lu (see here) que « pratique courante » pour imprimer une trace de pile en utilisant backtrace() pendant un gestionnaire de signal d'erreur (par exemple lors de la manipulation SIGSEGV) sous Linux est de:fonction trace() au cours de gestionnaire de signal d'erreur (SIGSEGV)

1 Obtenez le pointeur d'instruction (EIP ou RIP) à partir de la structure non documentée sigcontext.

2 Remplacer la deuxième trame dans la trace de la pile avec le pointeur d'instruction, étant donné que la première trame est le gestionnaire de signaux, et la deuxième trame est supposé être à l'intérieur de libc dans le code sigaction, qui a remplacé la trame d'origine, dans lequel la faute est survenue.

3 Imprimez la trace à partir de la deuxième image nouvellement remplacée.

Il me semble dans mes tests (sur x86_64 noyau 2.6) qui en fait la trame d'origine dans lequel la faute a eu lieu est présent dans la trace de la pile donnée par backtrace() dans le 3ème cadre - le premier est le gestionnaire de signal et la 2ème est dans libc code de traitement du signal.

Est-ce que ce changement dans la gestion du signal du noyau est documenté quelque part que vous pouvez référencer pour moi? Il me semble que le résultat est que vous pouvez éviter de remplacer des cadres du pointeur d'instruction, et juste imprimer la trace de la pile de backtrace() en commençant par l'image 3, mais je veux la confirmation que c'est un comportement connu et la bonne façon pour le faire.

Répondre

5

C'est une chose intéressante à faire, mais ce n'est pas vraiment portable et ne sera probablement jamais fiable à 100%. Il suffit donc de l'implémenter comme vous le dites, si cela fonctionne sur votre plate-forme, et d'y inclure quelques petits tests unitaires pour que vous sachiez tout de suite si un système que vous utiliserez dans le futur ne fonctionne pas de la même manière. Après tout, quand ce code est invoqué, vous êtes déjà foutu, alors faites de votre mieux et avancez.

Une alternative totalement différente qui est possible d'utiliser en même temps ou à la place de votre schéma, est d'écrire un script qui sera appelé par Linux quand un programme déverse le noyau. Ce script peut ensuite lancer gdb en mode batch sur le fichier core pour obtenir le backtrace et vous envoyer un email ou autre.

Questions connexes