Encontrar la fuente de una señal UNIX de Coredump
crash gdb (2)
Esto ha sido una pregunta larga pendiente en mi mente. Veo que GDB nos dice la señal que causa la terminación del proceso.
¿Cómo encuentro la fuente de la señal desde un núcleo?
En dos ocasiones diferentes, mis dos aplicaciones recibieron SIGEMT y SIGUSR1. Sé que hay otras aplicaciones en producción que pueden enviar estas señales.
Además, sé que la información del remitente se puede ver dentro del programa en ejecución y los datos estarían presentes en la estructura siginfo_t . Pero no tengo ese lujo y, de hecho, no tenemos controlador para esta señal en absoluto.
También puede leer esta información del volcado del núcleo por eu-readelf
:
$ eu-readelf --notes coredump | head
Note segment of 3180 bytes at offset 0x4a0:
Owner Data size Type
CORE 336 PRSTATUS
info.si_signo: 6, info.si_code: 0, info.si_errno: 0, cursig: 6
sigpend: <>
sighold: <>
pid: 28046, ppid: 3774, pgrp: 28046, sid: 3774
utime: 0.000000, stime: 0.002895, cutime: 0.000000, cstime: 0.000000
orig_rax: 35, fpvalid: 1
Nota info.si_signo: 6
, lo que significa que el proceso fue asesinado por SIGABRT.
Las versiones suficientemente recientes del kernel de Linux almacenan esta información en el archivo central. Y, las versiones recientes de gdb pueden leerlo. Luego puede usar print $_siginfo
con un archivo core tal como lo haría al depurar en vivo.