PROBLEM
Please Help me C++ guros with my problem in Pro*C.
I am having MEMORY LEAK leak problems with PRO*C. I am running the code below repeatedly and the vm of my application continuously increases.
SQL STATEMENT
/* select and lock table using FOR UPDATE */
EXEC SQL AT :sql_dbname DECLARE update_mid_cursor CURSOR
FOR SELECT ROWID
FROM PAYPAL_TRANS
//WHERE PHP_AMT = 0
WHERE TO_NUMBER(SUBSTR(MSINDN, 1, 5)) = :sql_range AND MODEM_ID = 0
ORDER BY ROWID ASC
FOR UPDATE;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[2])", sqlca, KILLAPP);
}
/* Open the cursor */
rows_to_select = 100;
EXEC SQL FOR :rows_to_select OPEN update_mid_cursor;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[3])", sqlca, KILLAPP);
}
EXEC SQL FOR :rows_to_select FETCH update_mid_cursor
INTO :sql_rowid;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[4])", sqlca, KILLAPP);
}
rows_to_select = sqlca.sqlerrd[2];
if (rows_to_select > 0) {
EXEC SQL AT :sql_dbname FOR :rows_to_select
UPDATE PAYPAL_TRANS
SET MODEM_ID = :sql_modem_id, TXT_MODEM_ID = :sql_txt_modem_id
WHERE ROWID = :sql_rowid;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[5])", sqlca, KILLAPP);
}
}
EXEC SQL CLOSE update_mid_cursor;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[6])", sqlca, KILLAPP);
}
EXEC SQL AT :sql_dbname COMMIT WORK;
if (sqlca.sqlcode != 0) {
DBError("ORACLE(GetMIDAssign[7])", sqlca, KILLAPP);
}
SOME OF THE THINGS I HAVE ACCOMPLISHED TRYING TO SOLVE THIS PROBLEM
1. determine if the problem is with the application code. Through isolation,
we were was able to conclude that the problem occurs with the pro*c code
2. checked the usage of cursors on the oracle server. I have experimented
with the RELEASE_CURSOR and HOLD_CURSOR pro*c precompiler options.
The application was able to properly close and release the cursor
according to our queries inside sqlplus.
SELECT * FROM V$SYSSTAT WHERE NAME LIKE '%cursor%';
STATISTIC# NAME
---------- ----------------------------------------------------------------
CLASS VALUE
---------- ----------
2 opened cursors cumulative
1 2825549
3 opened cursors current
1 22
205 session cursor cache hits
64 0
STATISTIC# NAME
---------- ----------------------------------------------------------------
CLASS VALUE
---------- ----------
206 session cursor cache count
64 0
207 cursor authentications
128 338
SQL>
3. used YAMD 0.32 to determine memory leaks. After recompiling and running
the application with the YAMD library, the following is a small snippet of what
was dumped on stdout:
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6da7a00]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcxt+0x63)[0xb6da8173]
./gsm(vfprintf+0x8a7)[0x8049b0b]
./gsm(fwrite+0x166)[0x80495ca]
/lib/tls/libc.so.6(__libc_start_main+0xf8)[0xb6ab1748]
./gsm(_IO_getc+0x4d)[0x80494c1]
END TRACEBACK
WARNING: Memory leak
Address 0xb6a58fa0, size 96
Allocated by malloc at
BEGIN TRACEBACK
/lib/tls/libc.so.6(malloc+0x35)[0xb6b0bda5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sltskminit+0x1f)[0xb7404ccf]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sltsini+0x75)[0xb74022f5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(slxmxinit+0x1a)[0xb73f7a4a]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(lxzinit+0x32)[0xb73f6522]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpummpin+0x199)[0xb72d7419]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpupin+0x59)[0xb6e0d359]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(OCIInitialize+0x3c)[0xb6e61b8c]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6dbb4d5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcfx+0x117)[0xb6dbbf57]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6da7a00]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcxt+0x63)[0xb6da8173]
./gsm(vfprintf+0x8a7)[0x8049b0b]
./gsm(fwrite+0x166)[0x80495ca]
/lib/tls/libc.so.6(__libc_start_main+0xf8)[0xb6ab1748]
./gsm(_IO_getc+0x4d)[0x80494c1]
END TRACEBACK
WARNING: Memory leak
Address 0xb6a5bfa0, size 96
Allocated by malloc at
BEGIN TRACEBACK
/lib/tls/libc.so.6(malloc+0x35)[0xb6b0bda5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sltsini+0x4c)[0xb74022cc]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(slxmxinit+0x1a)[0xb73f7a4a]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(lxzinit+0x32)[0xb73f6522]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpummpin+0x199)[0xb72d7419]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpupin+0x59)[0xb6e0d359]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(OCIInitialize+0x3c)[0xb6e61b8c]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6dbb4d5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcfx+0x117)[0xb6dbbf57]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6da7a00]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcxt+0x63)[0xb6da8173]
./gsm(vfprintf+0x8a7)[0x8049b0b]
./gsm(fwrite+0x166)[0x80495ca]
/lib/tls/libc.so.6(__libc_start_main+0xf8)[0xb6ab1748]
./gsm(_IO_getc+0x4d)[0x80494c1]
END TRACEBACK
WARNING: Memory leak
Address 0xb6a6ab56, size 148650
Allocated by malloc at
BEGIN TRACEBACK
/lib/tls/libc.so.6(malloc+0x35)[0xb6b0bda5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sktsfMalloc+0x1f)[0xb73971bf]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpummealloc+0x55)[0xb72d8335]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpuiniSG+0x47)[0xb6e0d607]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpummpin+0x10c)[0xb72d738c]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(kpupin+0x59)[0xb6e0d359]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(OCIInitialize+0x3c)[0xb6e61b8c]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6dbb4d5]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcfx+0x117)[0xb6dbbf57]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0[0xb6da7a00]
/u01/app/oracle/product/9.2.0/lib/libclntsh.so.9.0(sqlcxt+0x63)[0xb6da8173]
./gsm(vfprintf+0x8a7)[0x8049b0b]
./gsm(fwrite+0x166)[0x80495ca]
/lib/tls/libc.so.6(__libc_start_main+0xf8)[0xb6ab1748]
./gsm(_IO_getc+0x4d)[0x80494c1]
END TRACEBACK
WARNING: Total memory leaks:
603 unfreed allocations totaling 751211 bytes
*** Finished at Fri Mar 4 12:01:04 2005
Allocated a grand total of 1123035 bytes
1725 allocations
Average of 651 bytes per allocation
Max bytes allocated at one time: 900999
21512 K alloced internally / 12384 K mapped now / 12040 K max
Virtual program size is 34192 K
End.
Clearly, we have a memory leak problem.
ENVIROMENT SETTINGS
(1) Makefile snippet
PROCPPFLAGS=CODE=CPP CPP_SUFFIX=c THREADS=YES HOLD_CURSOR=YES MAXOPENCURSORS=10 $(CPLUS_SYS_INCLUDE) select_err=no
ORACLE_INCLUDE=-O3 -trigraphs -fPIC -DPRECOMP -D_REENTRANT -I/u01/app/oracle/product/9.2.0/precomp/hdrs - I/u01/app/oracle/product/9.2.0/precomp/public -I/u01/app/oracle/product/9.2.0/precomp/include - I/u01/app/oracle/product/9.2.0/oracore/include -I/u01/app/oracle/product/9.2.0/oracore/public - I/u01/app/oracle/product/9.2.0/oracore/port/include -I/u01/app/oracle/product/9.2.0/xdk/include - I/u01/app/oracle/product/9.2.0/xdk/public -I/u01/app/oracle/product/9.2.0/nlsrtl/include - I/u01/app/oracle/product/9.2.0/slax/include -I. -I../c++_lib -I/usr/include/c++/3.2.3/backward
ora_db.o: ora_db.pc
$(PROC) $(PROCPPFLAGS) SYS_INCLUDE=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include,../c++_lib) iname=ora_db.pc
${MAKE} ${ORACLE_INCLUDE} -D_REENTRANT -c ora_db.c
(2) Red Hat Linux 2.4.21-4.ELsmp
(3) Oracle Version 9.2.0.1
(4) Pro*C/C++: Release 9.2.0.1.0 - Production on Fri Mar 4 14:01:22 2005
(5) YAMD 0.32