Peut-on utiliser libSegFault.donc, pour avoir des backtraces pour SIGABRT?
L'incantation magique
LD_PRELOAD=/lib/libSegFault.so someapp
pistes someapp
avec libSegFault.donc, fournir des informations de backtrace sur un SIGSEGV comme décrit dans beaucouplieux.
Autre que l'aide de <!-- 2 - - - comme des approches pour causer SIGABRT
pour appeler le SIGSEGV
gestionnaire, est-il un moyen d'obtenir libSegFault de fournir backtrace informations pour assert(3)
échecs?
2 réponses
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/libSegFault.so someapp
notez que le chemin réel vers la bibliothèque de préchargement peut différer. Sur ma machine, j'utiliserais
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so some-64bit-app
ou
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/i386-linux-gnu/libSegFault.so some-32bit-app
selon que l'application que j'exécutais était compilée 64 bits ou 32 bits. (Vous pouvez utiliser file
à vérifier.)
source indique qu'il y a trois variables d'environnement qui définissent comment libSegFault.so
se comporte:
SEGFAULT_SIGNALS
: La liste des signaux qui cause une trace de pile. La valeur par défaut estSIGSEGV
. Un défini, mais il est videSEGFAULT_SIGNALS
signifie qu'aucun signal ne cause une trace de pile. Les valeurs supportées sontsegv
,ill
,abrt
,fpe
,bus
sur les systèmes qui ont le signal SIGBUS,stkflt
sur les systèmes qui ont le signal SIGSTKFLT, etall
pour tout cela.SEGFAULT_USE_ALTSTACK
: Si elle est définie dans l'environnement,libSegFault.so
utilise une pile d'altenate pour les signaux de trace de la pile. Cela peut s'avérer utile si vous déboguez corruption de la pile.SEGFAULT_OUTPUT_NAME
: si défini dans l'environnement, la trace de la pile est écrite dans ce fichier au lieu de l'erreur standard.
pour être honnête, je les ai trouvées d'abord en examinant la bibliothèque avec strings /lib/libSegFault.so | sed -e '/[^0-9A-Z_]/ d'
. Toutes les bibliothèques standard (libSegFault.so
ayant fait partie de la bibliothèque C de GNU) sont réglables via des variables d'environnement, donc utiliser quelque chose comme cette commande pour vider toutes les chaînes qui ressemblent à des noms de variables d'environnement est une solution rapide un moyen de trouver des choses à chercher. Faire une recherche web sur "SEGFAULT_SIGNALS" "SEGFAULT_OUTPUT_NAME"
produit un certain nombre de liens utiles; voyant qu'il faisait partie de la bibliothèque GNU C de nos jours, je suis allé à la source git archives, trouvé le fichier source pour la bibliothèque, et posté ma réponse.
dans la même veine, le gestionnaire d'exception glibc écrit un dump stack à /dev/console
sur les erreurs de corruption de tas.
si vous exécutez votre exécutable dans un processus non tty (c.-à-d. un processus systemd ou un autre processus détaché), la sortie de crash va à /dev/null
, qui n'est pas très utile.
Il y a une fonctionnalité non documentée pour rediriger la sortie vers /dev/stderr
. Définissez la variable d'environnement suivante:
export LIBC_FATAL_STDERR_=1
ceci peut être utilisé en conjonction avec libSegFault.donc pour le maximum de la médecine légale.
il est également intéressant de mentionner que cela pourrait vous donner deux traces de pile si vous activez aussi les rétrotraces pour SIGABRT, car la glibc fait d'abord une trace de pile, puis signale SIGABRT ... et puis libSegFault donne une seconde trace de pile.