SIGSEGV/SIGABRT 및 친구를 위한 Oracle Pro*C/OCI 설치 핸들러 - 사용하지 않는 이유 및 방법
Pro*C(Oracle for C-Code의 임베디드 SQL 전처리기) 또는 OCI를 사용할 때 connect/init 루틴이 일부 신호 처리기를 설치한다는 것을 알게 되었습니다.
그것은 a 이전을 의미합니다.
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;
또는
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()
그리고 0x7⁄9ea17f9c는 다음을 의미합니다.skgesig_sigactionHandler()
정의된 두 기호libclntsh.so.11.1
오라클 런타임 라이브러리.
저는 오라클 신호 처리기가 상당히 비결정론적인 행동을 도입하는 것처럼 보이기 때문에 걱정됩니다.즉, OS, 하드웨어 및 다음과 같은 장애/중단 유형에 따라 다음과 같은 동작이 관찰되었습니다.
- 유용한 정보가 별로 들어 있지 않은 추악한 스택 트레이스
- exit-status 1로 프로그램 종료 직접 - 코어 파일 쓰기 및 오류 메시지 없음
- 종료 상태가 0인 직접 프로그램 종료(종료!)
특히 마지막 행동은 기괴합니다.
따라서 저는 다음에 관심이 있습니다.
- 동기 - 왜 오라클이 신호 처리기를 설치합니까?
- 비활성화 방법 - 최소한 기본적으로 코어 파일을 생성하는 신호의 경우 - 내 사용 사례의 경우, 나는 그러한 상황(개발 중)에서 코어 또는 신뢰할 수 있고 정보를 제공하는 운영 종료 상태를 원하기 때문입니다.
- 예를 들어 Oracle 신호 처리기를 덮어쓰는 것이 안전합니까?
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
? - 연결 후 SIGABRT/SIGSEGV 및 친구를 SIG_DFL로 재설정할 때의 단점은 무엇입니까?
신호 처리 및 진단 프레임워크 고려 사항: OCI 진단 프레임워크는 응용 프로그램에서 사용하는 신호 처리에 영향을 줄 수 있는 신호 처리기를 설치합니다.다음을 설정하여 OCI 신호 처리를 비활성화할 수 있습니다.
DIAG_SIGHANDLER_ENABLED=FALSE
sqlnet.ora 파일에 있습니다.자세한 내용은 Oracle Call Interface Programmer's Guide의 "OCI의 결함 진단"을 참조하십시오.
sqlnet.ora 파일에서 이 환경 변수를 구성해 보십시오.
Oracle 패치를 적용할 수 있습니다..so
대체할 파일sigaction
으로 끈을 매다.nosigactn
그리고 당신의 프로그램에서 작동하지 않는 기능을 만듭니다.nosigactn
와 같은 서명으로sigaction
.
언급URL : https://stackoverflow.com/questions/17124881/oracle-proc-oci-install-handlers-for-sigsegv-sigabrt-and-friends-why-and-how
'programing' 카테고리의 다른 글
GDB 및 C를 위한 멀티스레드 디버깅 튜토리얼 (0) | 2023.08.25 |
---|---|
HTML 문자열을 이미지로 변환 (0) | 2023.08.20 |
오라클에서 타임스탬프 정밀도를 높게 선택할 경우의 단점은 무엇입니까? (0) | 2023.08.20 |
마리아드브를 어떻게 삽입합니까? (0) | 2023.08.20 |
예외를 던지지 않고 문자열이 GUID인지 테스트하시겠습니까? (0) | 2023.08.20 |