Гуру C ++, я полностью сбит с толку поведением некоторого кода, и мне нужно как можно больше помощи, чтобы разобраться с ним.
Я публикую приложение C ++ из Oracle 10g в 11g2, и код не может подключиться к базе данных Oracle. На самом деле, он выдает ошибку сегментации без выброса ядра, и я не могу понять, в чем проблема, потому что код отлично работает с Oracle 10g.
(*oci)->status = OCIInitialize(OCI_OBJECT, 0, 0, 0, 0);
(*oci)->status = OCIEnvInit(&(*oci)->envhp, OCI_DEFAULT, 0, 0);
Я просто заменил оба звонка на OCIEnvCreate
(следуя документации Oracle)
Трассировка DBX четко указывает на то, что процесс OCIEnvCreate
вызов функции. Если это помогает, вот последовательность вызовов, которые делает код:
t@6 (l@6) signal SEGV (no mapping at the fault address) in ltzGetFileContentVer at 0xfd5994d4
0xfd5994d4: ltzGetFileContentVer+0x0008: ld [%o0], %g4
Current function is oci_initialize
(dbx) where
current thread: t@6
[1] ltzGetFileContentVer(0xfbe80000, 0xfb9faf08, 0xfeccbda4, 0x0, 0xa70f04, 0xa6fea0), at 0xfd5994d4
[2] lditzver(0xfbe80000, 0x0, 0xfb9faf08, 0xfb9faf0a, 0x400, 0x0), at 0xfd5620cc
[3] kpuiniPG(0x270cf8, 0x1, 0xfebf76dc, 0xfe9f7ca8, 0xfe9f792c, 0x106c), at 0xfcc49b9c
[4] kpuinit0(0x1c2790, 0x20, 0xfe9be6fc, 0x270798, 0xfea43a90, 0xfcc495c4), at 0xfcc47808
[5] kpuenvcr(0x0, 0x1400, 0x0, 0x1b4000, 0x0, 0x40), at 0xfcc4659c
[6] OCIEnvCreate(0x1c2790, 0x0, 0x0, 0x0, 0x0, 0x20000), at 0xfcadb48c
=>[7] oci_initialize(oci = 0x2070f0), line 150 in "oci_helper.c"
int oci_initialize(oci_helper_t** oci)
{
if (NULL == oci)
return OCIHELP_INVALID_ARGUMENT;
*oci = (oci_helper_t*)malloc(sizeof(oci_helper_t));
if (NULL == *oci)
return OCIHELP_NOT_ENOUGH_MEMORY;
(*oci)->status = OCIEnvCreate(&(*oci)->envhp,(ub4) OCI_THREADED | OCI_OBJECT,0,0,0,0,0,0);
if ((*oci)->status != OCI_SUCCESS) {
return OCIHELP_CALL_ERROR;
}
(*oci)->status = OCIHandleAlloc((*oci)->envhp, (void*)&(*oci)->errhp, OCI_HTYPE_ERROR, 0, 0);
if ((*oci)->status != OCI_SUCCESS)
return OCIHELP_CALL_ERROR;
(*oci)->status = OCIHandleAlloc((*oci)->envhp, (void*)&(*oci)->srvhp, OCI_HTYPE_SERVER, 0, 0);
if ((*oci)->status != OCI_SUCCESS)
return OCIHELP_CALL_ERROR;
(*oci)->status = OCIDescriptorAlloc((*oci)->envhp, (void*)&(*oci)->msgprop, OCI_DTYPE_AQMSG_PROPERTIES, 0, 0);
if ((*oci)->status != OCI_SUCCESS)
return OCIHELP_CALL_ERROR;
return OCIHELP_CALL_OK;
}
Задача ещё не решена.
Других решений пока нет …