Oracle 使用OCI_线程选项设置OCI环境失败后,尝试释放OCIEnv结构时发生分段错误 总结

Oracle 使用OCI_线程选项设置OCI环境失败后,尝试释放OCIEnv结构时发生分段错误 总结,oracle,oracle-call-interface,Oracle,Oracle Call Interface,使用OCI_线程选项的OCI环境设置失败后,尝试释放OCIEnv结构时会发生分段错误(失败原因是NLS_LANG环境变量配置错误) 当在没有OCI_线程选项的情况下调用OCIEnvCreate时,示例代码不会崩溃,它会按预期工作 示例代码 堆栈跟踪 问题是uu pthread_mutex_destroy是用空指针调用的 #0 __pthread_mutex_destroy (mutex=0x0) at pthread_mutex_destroy.c:28 #1 0x00007ffff

使用OCI_线程选项的OCI环境设置失败后,尝试释放OCIEnv结构时会发生分段错误(失败原因是NLS_LANG环境变量配置错误)

当在没有OCI_线程选项的情况下调用OCIEnvCreate时,示例代码不会崩溃,它会按预期工作

示例代码 堆栈跟踪 问题是uu pthread_mutex_destroy是用空指针调用的

#0    __pthread_mutex_destroy (mutex=0x0) at pthread_mutex_destroy.c:28
#1    0x00007ffff585e6e0 in sltsmxd () from /lib/libclntsh.so.11.1
#2    0x00007ffff56a147c in kpufhndl0 () from /lib/libclntsh.so.11.1
#3    0x00007ffff56a0185 in kpufhndl () from /lib/libclntsh.so.11.1
#4    0x00007ffff567cac1 in OCIHandleFree () from /lib/libclntsh.so.11.1
#5    0x0000000000400a0c in my_connect (username=0x400dd1 "test_user", password=0x400dca       "qqq123", sid=0x400dc7 "XE") at test2.c:24
#6    0x0000000000400c27 in main () at test2.c:84
产品详情 操作系统详细信息 问题: 目前我只是没有释放内存区域,但这不是一个好的解决方案。
您认为什么是好的解决方案?

这看起来可能是“基本Lite”即时客户端中的一个bug,尽管我在MOS上看不到任何相关内容;但是如果是这样的话,那么在
OCIEnvCreate()
中,而不是像我认为的那样在
OCIHandleFree()

我看到的示例代码中没有一个在遇到
OCIEnvCreate()
故障时尝试清理
OCIEnv
;它似乎总是刚刚退出,包括。看起来该函数正在创建
OCIEnv
结构,因为您得到了指向它的指针,但可能还没有分配该结构的内部。由于它处于一种不确定的状态,试图清理它可能是一项吃力不讨好的任务。因此,似乎不调用
OCIHandleFree()
就可以了

我能够使用Oracle Enterprise Linux 5.6下的Linux x86-64的11.2.0.3.0 Basic Lite客户端包(从)重新创建问题。使用基本(非Lite)客户端软件包时,未发现问题-没有内存故障,也没有“无法初始化环境”消息,因此
OCIEnvCreate()
调用成功。但它确实无法登录,这可能更合理

这表明您不应该期望函数因为
NLS\u LANG
值而失败-这部分看起来像一个bug。如果它确实因为其他原因失败了,那么不要试图清理。我看不出有任何迹象表明SDK不应该与Lite软件包一起工作,但您正在强制失败,然后试图清理超出正常范围的内容,因此这种组合以前可能不常见。即使没有清理触发内存故障,但看起来它在错误的点失败了


要克服明显的错误并在正确的点上获得失败,在登录期间,您可能需要切换到基本(非Lite)客户端包。

FWIW,我在OEL 5.6上使用11gR2(11.2.0.3)64位基本Lite客户端从您的代码中得到相同的错误,但不是基本客户端-它甚至没有收到“无法初始化环境”消息,它可以登录和注销。lite版本得到错误2,“没有这样的文件或目录”,可能是在寻找一些与NLS相关但不存在的东西。你可能会认为非精简版的会在某处抱怨无效的NLS_LANG。使用非lite即时客户端作为解决方案是否可行?谢谢您的回答。我下载了基本客户端(客户端共享库64位-11.2.0.3.0)。链接到libociei.so的二进制文件。当NLS_LANG设置为无效值时,我得到了“登录失败”(但segfault消失:-)。我同意您的看法,问题不在OCIHandlerFree()中。(我认为OCIEnvCreate不应该创建不确定的状态,只需要返回错误和空指针。我还认为NLS_LANG不应该影响登录,它属于创建OCIEnv。)切换到基本客户端包是一个可以接受的解决方案,谢谢。
export NLS_LANG=x
#0    __pthread_mutex_destroy (mutex=0x0) at pthread_mutex_destroy.c:28
#1    0x00007ffff585e6e0 in sltsmxd () from /lib/libclntsh.so.11.1
#2    0x00007ffff56a147c in kpufhndl0 () from /lib/libclntsh.so.11.1
#3    0x00007ffff56a0185 in kpufhndl () from /lib/libclntsh.so.11.1
#4    0x00007ffff567cac1 in OCIHandleFree () from /lib/libclntsh.so.11.1
#5    0x0000000000400a0c in my_connect (username=0x400dd1 "test_user", password=0x400dca       "qqq123", sid=0x400dc7 "XE") at test2.c:24
#6    0x0000000000400c27 in main () at test2.c:84
Basic Lite Package Information

Thu Oct  4 13:00:49 UTC 2007

Client Shared Library 64-bit - 11.1.0.6.0

System name:    Linux
Release:        2.6.9-34.0.1.0.11.ELsmp
Version:        #1 SMP Mon Dec 4 22:20:39 UTC 2006
Machine:        x86_64
Linux 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 x86_64 GNU/Linux
Distributor ID:    Ubuntu
Description:       Ubuntu 10.04.4 LTS
Release:           10.04
Codename:          lucid