useful tipos tag sirve que para metatags importantes google ejemplo description crear stack-trace glibc sigabrt sigsegv backtrace

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 es SIGSEGV . Un SEGFAULT_SIGNALS definido pero vacío significa que ninguna señal causa un seguimiento de la pila. Los valores admitidos son segv , ill , abrt , fpe , bus en sistemas que tienen la señal SIGBUS, stkflt en sistemas que tienen la señal SIGSTKFLT y all 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.