stack-trace - tipos - title en seo
¿Se puede usar libSegFault.so para obtener backtraces para SIGABRT? (2)
De manera similar, el controlador de excepciones de glibc escribe un volcado de pila en /dev/console
en los errores de corrupción de pila.
Si está ejecutando su ejecutable en un modo no tty (es decir, un proceso de systemd u otro proceso separado), la salida del fallo va a /dev/null
, lo que no es tan útil.
Hay una función no documentada para redirigir la salida a /dev/stderr
. Establecer la siguiente variable de entorno:
export LIBC_FATAL_STDERR_=1
Esto se puede usar junto con libSegFault.so para forensics máximos.
También vale la pena mencionar que esto podría darle dos trazas de pila si también habilita las tiras inversas para SIGABRT, ya que glibc primero hace una traza de pila, luego señala SIGABRT ... y luego libSegFault proporciona una segunda traza de pila.
El encantamiento mágico
LD_PRELOAD=/lib/libSegFault.so someapp
ejecuta someapp
con libSegFault.so que proporciona información de seguimiento en un SIGSEGV como se describe en many places different .
Además de utilizar enfoques similares a la signal(7)
para hacer que SIGABRT
invoque el controlador SIGSEGV
, ¿hay alguna forma de que libSegFault proporcione información de seguimiento para las fallas de aserción assert(3)
?
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/libSegFault.so someapp
Tenga en cuenta que la ruta real a la biblioteca de precarga puede diferir. En mi máquina, usaría
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so some-64bit-app
o
env SEGFAULT_SIGNALS="abrt segv" LD_PRELOAD=/lib/i386-linux-gnu/libSegFault.so some-32bit-app
Dependiendo de si la aplicación que estaba ejecutando fue compilada de 64 bits o de 32 bits. (Puedes usar el file
para verificar).
La source nos dice que hay tres variables de entorno que definen cómo se comporta libSegFault.so
:
SEGFAULT_SIGNALS
: La lista de señales que causan un seguimiento de la pila. El valor predeterminado esSIGSEGV
. UnSEGFAULT_SIGNALS
definido pero vacío significa que ninguna señal causa un seguimiento de la pila. Los valores admitidos sonsegv
,ill
,abrt
,fpe
,bus
en sistemas que tienen la señal SIGBUS,stkflt
en sistemas que tienen la señal SIGSTKFLT yall
para todos estos.SEGFAULT_USE_ALTSTACK
: Si se define en el entorno,libSegFault.so
utiliza una pila de atenuación para las señales de rastreo de la pila. Esto puede ser útil si está depurando la corrupción de la pila.SEGFAULT_OUTPUT_NAME
: si está definido en el entorno, el seguimiento de la pila se escribe en este archivo en lugar de un error estándar.
Para ser honesto, al principio los encontré examinando la biblioteca con strings /lib/libSegFault.so | sed -e ''/[^0-9A-Z_]/ d''
strings /lib/libSegFault.so | sed -e ''/[^0-9A-Z_]/ d''
. Todas las bibliotecas estándar ( libSegFault.so
han convertido en parte de la biblioteca GNU C) se pueden ajustar a través de variables de entorno, por lo que usar algo como ese comando para volcar cadenas que parecen nombres de variables de entorno es una forma rápida de buscar cosas para buscar. Al realizar una búsqueda en la web de "SEGFAULT_SIGNALS" "SEGFAULT_OUTPUT_NAME"
obtienen varios enlaces útiles; Al ver que era parte de la biblioteca de GNU C en la actualidad, fui a los archivos de git de source , encontré el archivo de origen real de la biblioteca y publiqué mi respuesta.