2013-06-15 9 views
9

Quando si utilizza Pro * C (un preprocessore SQL incorporato da Oracle per C-Code) o OCI, ho notato che la routine connect/init installa alcuni gestori di segnale.Oracle Pro * C/OCI installa gestori per SIGSEGV/SIGABRT e amici - perché e come disabilitare?

questo significa che prima un

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

o un

OCIEnvNlsCreate() 

posso verificare che ad esempio quei segnali hanno seguenti gestori:

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 

Dopo l'istruzione/init connect la tabella è simile a:

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 

dove 0x7eff9e60bdac denota sslsshandler() e 0x7eff9ea17f9c denota skgesig_sigactionHandler() - entrambi i simboli definiti nella libclntsh.so.11.1 - la libreria di runtime di Oracle.

Sono preoccupato per questi gestori di segnale Oracle perché sembra che introducano un comportamento non deterministico. Ciò significa che a seconda del sistema operativo, l'hardware e il tipo di segfault/abortire ho osservato seguente comportamento:

  • una brutta stacktrace che non contiene molte informazioni utili
  • all'uscita del programma direttamente con uscita-status 1 - senza qualsiasi scrittura del file core e nessun messaggio di errore
  • all'uscita del programma direttamente con uscita-stato 0 (sic!)

Specialmente l'ultimo comportamento è grottesca.

Così, Sono interessato a:

  • la motivazione - perché sono quei gestori di segnali installati da parte di Oracle?
  • come disabilitarli? - almeno per i segnali che generano un file core di default - perché per il mio caso d'uso voglio un core in queste circostanze (durante lo sviluppo) o uno stato di uscita affidabile e informativo nella produzione
  • è sicuro sovrascrivere il segnale Oracle -handler via es act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);?
  • Quali sono gli svantaggi di reimpostare SIGABRT/SIGSEGV e gli amici su SIG_DFL dopo la connessione?
+1

migliore soluzione sarebbe quella di non usare buggy, il software non-thread-safe come Oracle. –

risposta

8

Considerazioni sulla gestione del segnale e del quadro diagnostico: il framework diagnostico OCI installa gestori di segnale che possono influire sulla gestione dei segnali utilizzata nell'applicazione. È possibile disabilitare la gestione del segnale OCI impostando

DIAG_SIGHANDLER_ENABLED=FALSE 

nel file sqlnet.ora. Per informazioni, consultare "Fault Diagnosability in OCI" in Oracle Call Interface Programmer's Guide.

Si prega di provare a configurare questa variabile di ambiente nel file di sqlnet.ora

+0

Prima di modificare il file 'sqlnet.ora' a livello di sistema, è possibile testarlo rapidamente localmente in questo modo:' echo DIAG_SIGHANDLER_ENABLED = FALSE> sqlnet.ora; esporta TNS_ADMIN = $ PWD' – maxschlepzig

0

avrei patchare il file di Oracle .so per sostituire la stringa sigaction con nosigactn e fare una funzione di no-op nel programma chiamato nosigactn con la stessa firma sigaction.

Problemi correlati