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?

26
demandé sur Rhys Ulerich 2013-09-10 00:27:43

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 est SIGSEGV. Un défini, mais il est vide SEGFAULT_SIGNALS signifie qu'aucun signal ne cause une trace de pile. Les valeurs supportées sont segv,ill,abrt,fpe,bus sur les systèmes qui ont le signal SIGBUS,stkflt sur les systèmes qui ont le signal SIGSTKFLT, et all 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.

31
répondu Nominal Animal 2013-09-23 18:26:56

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.

1
répondu Mark Lakata 2015-09-14 20:22:17