gpt4 book ai didi

c - Oracle Pro*C/OCI 为 SIGSEGV/SIGABRT 和 friend 安装处理程序 - 为什么以及如何禁用?

转载 作者:太空狗 更新时间:2023-10-29 16:48:50 24 4
gpt4 key购买 nike

当使用 Pro*C(来自 Oracle 的用于 C 代码的嵌入式 SQL 预处理器)或 OCI 时,我注意到 connect/init 例程安装了一些信号处理程序。

这意味着在

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(),0x7eff9ea17f9c 表示 skgesig_sigactionHandler() - 这两个符号都在 libclntsh.so.11.1 中定义 - Oracle 运行时图书馆。

我很担心那些 Oracle 信号处理程序,因为它们似乎引入了相当多的非确定性行为。这意味着根据操作系统、硬件和段错误/中止的种类,我观察到以下行为:

  • 不包含很多有用信息的丑陋堆栈跟踪
  • 直接程序退出,退出状态为 1 - 没有任何核心文件写入,也没有错误消息
  • 使用退出状态 0 直接退出程序(原文如此!)

尤其是最后一个行为很怪诞。

因此,我感兴趣的是:

  • 动机 - 为什么 Oracle 安装这些信号处理程序?
  • 如何禁用它们? - 至少对于默认产生核心文件的信号 - 因为对于我的用例,我想要在那些情况下(开发期间)的核心或生产中可靠且信息丰富的退出状态
  • 通过例如覆盖 Oracle 信号处理程序安全吗? act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0); ?
  • 在连接后将 SIGABRT/SIGSEGV 和 friend 重置为 SIG_DFL 有什么缺点?

最佳答案

信号处理和诊断框架注意事项:OCI 诊断框架安装的信号处理程序可能会影响您在应用程序中使用的任何信号处理。您可以通过设置

来禁用 OCI 信号处理
DIAG_SIGHANDLER_ENABLED=FALSE

在 sqlnet.ora 文件中。引用Fault Diagnosability in OCI中的“Oracle Call Interface Programmer's Guide”以供引用。

请尝试在sqlnet.ora文件中配置此环境变量

关于c - Oracle Pro*C/OCI 为 SIGSEGV/SIGABRT 和 friend 安装处理程序 - 为什么以及如何禁用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17124881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com