Controladores de instalación de Oracle Pro*C/OCI para SIGSEGV/SIGABRT y amigos: ¿por qué y cómo deshabilitarlos?

3 minutos de lectura

Controladores de instalacion de Oracle ProCOCI para SIGSEGVSIGABRT y amigos
maxschlepzig

Al usar Pro*C (un preprocesador de SQL incorporado de Oracle para C-Code) u OCI, noté que la rutina connect/init instala algunos controladores de señal.

Eso significa ante un

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;

o un

OCIEnvNlsCreate()

Puedo verificar que, por ejemplo, esas señales tienen los siguientes controladores:

No              NAME                Pointer   SA_SIGINFO   SIG_DFL   SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 1            SIGHUP                  (nil)        false      true     false
 2            SIGINT                  (nil)        false      true     false
 3           SIGQUIT                  (nil)        false      true     false
 4            SIGILL                  (nil)        false      true     false
 5           SIGTRAP                  (nil)        false      true     false
 6           SIGABRT                  (nil)        false      true     false
 7            SIGBUS                  (nil)        false      true     false
 8            SIGFPE                  (nil)        false      true     false
 9           SIGKILL                  (nil)        false      true     false
10           SIGUSR1                  (nil)        false      true     false
11           SIGSEGV                  (nil)        false      true     false
12           SIGUSR2                  (nil)        false      true     false
13           SIGPIPE                  (nil)        false      true     false
14           SIGALRM                  (nil)        false      true     false

Después de la instrucción connect/init, la tabla se ve así:

No              NAME                Pointer   SA_SIGINFO   SIG_DFL   SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
 1            SIGHUP                  (nil)        false      true     false
 2            SIGINT         0x7eff9e60bdac         true     false     false
 3           SIGQUIT         0x7eff9ea17f9c         true     false     false
 4            SIGILL         0x7eff9ea17f9c         true     false     false
 5           SIGTRAP         0x7eff9ea17f9c         true     false     false
 6           SIGABRT         0x7eff9ea17f9c         true     false     false
 7            SIGBUS         0x7eff9ea17f9c         true     false     false
 8            SIGFPE         0x7eff9ea17f9c         true     false     false
 9           SIGKILL                  (nil)        false      true     false
10           SIGUSR1                  (nil)        false      true     false
11           SIGSEGV         0x7eff9ea17f9c         true     false     false
12           SIGUSR2                  (nil)        false      true     false
13           SIGPIPE                    0x1         true     false      true
14           SIGALRM                  (nil)        false      true     false

donde 0x7eff9e60bdac denota sslsshandler() y 0x7eff9ea17f9c denota skgesig_sigactionHandler() – ambos símbolos definidos en libclntsh.so.11.1 – la biblioteca de tiempo de ejecución de Oracle.

Me preocupan esos manejadores de señales de Oracle porque parece que introducen un comportamiento bastante no determinista. Eso significa que, según el sistema operativo, el hardware y el tipo de error de segmento/aborto, he observado el siguiente comportamiento:

  • un stacktrace feo que no contiene mucha información útil
  • salida directa del programa con exit-status 1 – sin escribir ningún archivo central y sin mensaje de error
  • salida directa del programa con exit-status 0 (¡sic!)

Especialmente el último comportamiento es grotesco.

Por lo tanto, estoy interesado en:

  • la motivación: ¿por qué Oracle instala esos controladores de señal?
  • como desactivarlos? – al menos para señales que producen un archivo central de forma predeterminada – porque para mi caso de uso quiero un núcleo en esas circunstancias (durante el desarrollo) o un estado de salida confiable e informativo en producción
  • ¿Es seguro sobrescribir el controlador de señales de Oracle a través de, por ejemplo? act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0); ?
  • ¿Cuáles son las desventajas de restablecer SIGABRT/SIGSEGV y amigos a SIG_DFL después de conectarse?

  • La mejor solución sería no usar software con errores y no seguro para subprocesos como Oracle.

    – R.. GitHub DEJA DE AYUDAR A ICE

    15 de junio de 2013 a las 15:24

1647716468 133 Controladores de instalacion de Oracle ProCOCI para SIGSEGVSIGABRT y amigos
jjavibv

Consideraciones sobre el manejo de señales y el marco de diagnóstico: el marco de diagnóstico de OCI instala controladores de señales que pueden afectar cualquier manejo de señales que utilice en su aplicación. Puede deshabilitar el manejo de la señal OCI configurando

DIAG_SIGHANDLER_ENABLED=FALSE

en el archivo sqlnet.ora. Referirse a “Diagnosticabilidad de fallas en OCI” en Guía del programador de la interfaz de llamadas de Oracle para información.

Intente configurar esta variable de entorno en el archivo sqlnet.ora

  • Antes de cambiar todo el sistema sqlnet.ora archivo: puede probarlo rápidamente localmente de esta manera: echo DIAG_SIGHANDLER_ENABLED=FALSE > sqlnet.ora; export TNS_ADMIN=$PWD

    – maxschlepzig

    07/04/2017 a las 20:32

parchearía el oráculo .so archivo para reemplazar el sigaction cadena con nosigactn y crea una función no operativa en tu programa llamada nosigactn con la misma firma que sigaction.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad