Обработчики установки Oracle Pro * C / OCI для SIGSEGV / SIGABRT и других - почему и как отключить?

При использовании Pro * C (встроенный препроцессор SQL от Oracle для C-Code) или OCI я заметил, что процедура подключения / инициализации устанавливает некоторые обработчики сигналов.

Это означает, что перед

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

or a

OCIEnvNlsCreate()

Я могу проверить, например, что у этих сигналов есть следующие обработчики:

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

После оператора connect / init таблица выглядит так:

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

где 0x7eff9e60bdac обозначает sslsshandler(), а 0x7eff9ea17f9c обозначает skgesig_sigactionHandler() - оба символа определены в libclntsh.so.11.1 - библиотеке времени выполнения Oracle.

Меня беспокоят эти обработчики сигналов Oracle, потому что кажется, что они вводят довольно недетерминированное поведение. Это означает, что в зависимости от ОС, оборудования и типа segfault / abort я наблюдал следующее поведение:

  • уродливая трассировка стека, не содержащая много полезной информации
  • прямой выход из программы со статусом выхода 1 - без записи файла ядра и без сообщения об ошибке
  • прямой выход из программы со статусом выхода 0 (sic!)

Особенно гротескно последнее поведение.

Таким образом, меня интересуют:

  • мотивация - почему эти обработчики сигналов установлены Oracle?
  • как их отключить? - по крайней мере, для сигналов, которые по умолчанию выдают основной файл - потому что для моего варианта использования мне нужно ядро ​​при этих обстоятельствах (во время разработки) или надежный и информативный статус выхода в производстве
  • безопасно ли перезаписывать обработчик сигналов Oracle, например, act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);?
  • каковы недостатки сброса SIGABRT / SIGSEGV и друзей на SIG_DFL после подключения?

person maxschlepzig    schedule 15.06.2013    source источник
comment
Лучшим решением было бы не использовать ошибочное, небезопасное программное обеспечение, такое как Oracle.   -  person R.. GitHub STOP HELPING ICE    schedule 15.06.2013


Ответы (2)


Соображения относительно структуры обработки сигналов и диагностики: инфраструктура диагностики OCI устанавливает обработчики сигналов, которые могут повлиять на любую обработку сигналов, которую вы используете в своем приложении. Вы можете отключить обработку сигналов OCI, установив

DIAG_SIGHANDLER_ENABLED=FALSE

в файле sqlnet.ora. См. «Диагностика неисправностей в OCI» в Дополнительную информацию см. в Руководстве программиста Oracle Call Interface.

Попробуйте настроить эту переменную среды в файле sqlnet.ora

person jjavibv    schedule 05.02.2014
comment
Перед изменением общесистемного sqlnet.ora файла вы можете быстро протестировать его локально следующим образом: echo DIAG_SIGHANDLER_ENABLED=FALSE > sqlnet.ora; export TNS_ADMIN=$PWD - person maxschlepzig; 07.04.2017

Я бы пропатчил файл Oracle .so, заменив строку sigaction на nosigactn и сделав в вашей программе функцию без операций под названием nosigactn с той же подписью, что и sigaction.

person R.. GitHub STOP HELPING ICE    schedule 15.06.2013