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.