Overview
Features
Download
Documentation
Community
Add-Ons & Services

memory leak when inserting using ODBC connector

Please post support and help requests here.

Re: memory leak when inserting using ODBC connector

Postby alex » 26 Apr 2013, 07:23

There is a (8 byte) leak somewhere and it happens only when binding is created. However, I can not find it inside Poco code.
E.g. this will not cause leak:
Code: Select all
ses << "insert into test(cod) values(1)", now;

but this will:
Code: Select all
ses << "insert into test(cod) values(?)", use(value), now;


Here's the complete code snippet (ran on Windows):
Code: Select all
int main(int argc, char** argv)
{
   {
      {
      int value = 0;
      MemTrack::TrackListMemoryUsage();
      Session ses("ODBC", "DSN=PocoDataPgSQLTestW;UID=postgres;PWD=postgres;");
      Statement stmt(ses);
      stmt << "insert into test_leak_int(cod) values(?)", use(value);
      MemTrack::TrackListMemoryUsage();
      stmt.execute();
      }
      MemTrack::TrackListMemoryUsage();
   }

   return 0;
}

and memory usage output (generated with code from this branch):
Code: Select all
-----------------------
allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                            115 100.0%    2092 100.0%
--------                                           -----        -------
[totals]                                             115           2092

-----------------------
allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                           1044  99.9%   33384  99.8%
class Poco::Data::Binding<int>                         1   0.1%      60   0.2%
--------                                           -----        -------
[totals]                                            1045          33444

-----------------------
allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                            116 100.0%    2100 100.0%
--------                                           -----        -------
[totals]                                             116           2100

At this point, I'm not sure where to take it from here...
alex
 
Posts: 1101
Joined: 11 Jul 2006, 16:27
Location: United_States

Re: memory leak when inserting using ODBC connector

Postby alex » 26 Apr 2013, 07:28

FWIW, here's the ODBC trace difference between calls with and without use(value) as described above:
Code: Select all
Bindingd        1158-123c   ENTER SQLDescribeParam
      HSTMT               0x00877550
      UWORD                        1
      SWORD *             0x0062EAB8
      SQLULEN *           0x0062EABC
      SWORD *             0x0062EAC0
      SWORD *             0x0062EAC2

Bindingd        1158-123c   EXIT  SQLDescribeParam  with return code -1 (SQL_ERROR)
      HSTMT               0x00877550
      UWORD                        1
      SWORD *             0x0062EAB8
      SQLULEN *           0x0062EABC
      SWORD *             0x0062EAC0
      SWORD *             0x0062EAC2

      DIAG [IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0)

Bindingd        1158-123c   ENTER SQLGetDiagRecW
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLWCHAR *          0x0090CCF0
      SQLINTEGER *        0x0062DB08
      SQLWCHAR *          0x00912168
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D8E8

Bindingd        1158-123c   EXIT  SQLGetDiagRecW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLWCHAR *          0x0090CCF0 [       5] "IM001"
      SQLINTEGER *        0x0062DB08 (0)
      SQLWCHAR *          0x00912168 [      70] "[Microsoft][ODBC Driver Manager] Driver does not support this function"
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D8E8 (70)

Bindingd        1158-123c   ENTER SQLGetDiagFieldW
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 10
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D8E8

Bindingd        1158-123c   EXIT  SQLGetDiagFieldW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 10
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D8E8 (0)

Bindingd        1158-123c   ENTER SQLGetDiagFieldW
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 11
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D8E8

Bindingd        1158-123c   EXIT  SQLGetDiagFieldW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 11
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D8E8 (36)

Bindingd        1158-123c   ENTER SQLGetDiagRecW
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  2
      SQLWCHAR *          0x009065E8
      SQLINTEGER *        0x0062DB08
      SQLWCHAR *          0x009123C0
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D8E8

Bindingd        1158-123c   EXIT  SQLGetDiagRecW  with return code 100 (SQL_NO_DATA_FOUND)
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  2
      SQLWCHAR *          0x009065E8
      SQLINTEGER *        0x0062DB08
      SQLWCHAR *          0x009123C0
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D8E8

Bindingd        1158-123c   ENTER SQLDescribeColW
      HSTMT               0x00877550
      UWORD                        1
      WCHAR *             0x0091F778
      SWORD                     2048
      SWORD *             0x0062EAA4
      SWORD *             0x0062EAA6
      SQLULEN *           0x0062EAA8
      SWORD *             0x0062EAAC
      SWORD *             0x0062EAAE

Bindingd        1158-123c   EXIT  SQLDescribeColW  with return code -1 (SQL_ERROR)
      HSTMT               0x00877550
      UWORD                        1
      WCHAR *             0x0091F778
      SWORD                     2048
      SWORD *             0x0062EAA4
      SWORD *             0x0062EAA6
      SQLULEN *           0x0062EAA8
      SWORD *             0x0062EAAC
      SWORD *             0x0062EAAE

      DIAG [07009] Invalid column number in DescribeCol. (13)

Bindingd        1158-123c   ENTER SQLGetDiagRecW
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLWCHAR *          0x00906640
      SQLINTEGER *        0x0062D800
      SQLWCHAR *          0x00912168
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D5E0

Bindingd        1158-123c   EXIT  SQLGetDiagRecW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLWCHAR *          0x00906640 [       5] "07009"
      SQLINTEGER *        0x0062D800 (13)
      SQLWCHAR *          0x00912168 [      37] "Invalid column number in DescribeCol."
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D5E0 (37)

Bindingd        1158-123c   ENTER SQLGetDiagFieldW
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 10
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D5E0

Bindingd        1158-123c   EXIT  SQLGetDiagFieldW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 10
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D5E0 (0)

Bindingd        1158-123c   ENTER SQLGetDiagFieldW
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 11
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D5E0

Bindingd        1158-123c   EXIT  SQLGetDiagFieldW  with return code 0 (SQL_SUCCESS)
      SQLSMALLINT                  3
      SQLHANDLE           0x00877550
      SQLSMALLINT                  1
      SQLSMALLINT                 11
      SQLPOINTER         0x00912168
      SQLSMALLINT                256
      SQLSMALLINT *       0x0062D5E0 (36)

Bindingd        1158-123c   ENTER SQLGetDiagRecW
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  2
      SQLWCHAR *          0x00906640
      SQLINTEGER *        0x0062D800
      SQLWCHAR *          0x009123C0
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D5E0

Bindingd        1158-123c   EXIT  SQLGetDiagRecW  with return code 100 (SQL_NO_DATA_FOUND)
      SQLSMALLINT                  3 <SQL_HANDLE_STMT>
      SQLHANDLE           0x00877550
      SQLSMALLINT                  2
      SQLWCHAR *          0x00906640
      SQLINTEGER *        0x0062D800
      SQLWCHAR *          0x009123C0
      SQLSMALLINT                513
      SQLSMALLINT *       0x0062D5E0

Bindingd        1158-123c   ENTER SQLBindParameter
      HSTMT               0x00877550
      UWORD                        1
      SWORD                        1 <SQL_PARAM_INPUT>
      SWORD                      -16 <SQL_C_SLONG>
      SWORD                        4 <SQL_INTEGER>
      SQLULEN                    0
      SWORD                        0
      PTR                0x0062F9E0
      SQLLEN                     0
      SQLLEN *            0x00000000

Bindingd        1158-123c   EXIT  SQLBindParameter  with return code 0 (SQL_SUCCESS)
      HSTMT               0x00877550
      UWORD                        1
      SWORD                        1 <SQL_PARAM_INPUT>
      SWORD                      -16 <SQL_C_SLONG>
      SWORD                        4 <SQL_INTEGER>
      SQLULEN                    0
      SWORD                        0
      PTR                0x0062F9E0
      SQLLEN                     0
      SQLLEN *            0x00000000
alex
 
Posts: 1101
Joined: 11 Jul 2006, 16:27
Location: United_States

Re: memory leak when inserting using ODBC connector

Postby alex » 27 Apr 2013, 20:11

Here's some more test results (Windows 7, VS 2008).

SQL Server
Code: Select all
allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                             49 100.0%    1212 100.0%
--------                                           -----        -------
[totals]                                              49           1212


allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                            228  99.6%   36424  99.8%
class Poco::Data::Binding<int>                         1   0.4%      64   0.2%
--------                                           -----        -------
[totals]                                             229          36488

allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                             49 100.0%    1212 100.0%
--------                                           -----        -------
[totals]                                              49           1212


Oracle
Code: Select all
allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                             59 100.0%    1660 100.0%
--------                                           -----        -------
[totals]                                              59           1660

allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                            261  99.6%   21424  99.7%
class Poco::Data::Binding<int>                         1   0.4%      64   0.3%
--------                                           -----        -------
[totals]                                             262          21488

-----------------------
Memory Usage Statistics
-----------------------

allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                             59 100.0%    1660 100.0%
--------                                           -----        -------
[totals]                                              59           1660


Tracking can be enabled for Poco libs but output gets really verbose and result is the same, here's an example for SQL Server:
Code: Select all
-----------------------
Memory Usage Statistics
-----------------------

allocated type                                    blocks          bytes
--------------                                    ------          -----
struct std::_Tree_nod<class std::_Tmap_traits<int,int,struct std::less<int>,clas
s std::allocator<struct std::pair<int const ,int> >,0> >::_Node    38  64.4%
 912  54.9%
[unknown]                                             15  25.4%     612  36.9%
struct std::_Tree_nod<class std::_Tmap_traits<class std::basic_string<char,struc
t std::char_traits<char>,class std::allocator<char> >,struct Poco::Data::Session
Factory::SessionInfo,struct Poco::CILess,class std::allocator<struct std::pair<c
lass std::basic_string<char,struct std::char_traits<char>,class std::allocator<c
har> > const ,struct Poco::Data::SessionFactory::SessionInfo> >,0> >::_Node
2   3.4%     120   7.2%
class Poco::ReferenceCounter                           2   3.4%       8   0.5%
class Poco::Data::SQLite::Connector                    1   1.7%       4   0.2%
class Poco::Data::ODBC::Connector                      1   1.7%       4   0.2%
--------                                           -----        -------
[totals]                                              59           1660

-----------------------
Memory Usage Statistics
-----------------------

allocated type                                    blocks          bytes
--------------                                    ------          -----
[unknown]                                            270  59.7%   39328  89.2%
struct std::_Tree_nod<class std::_Tmap_traits<int,int,struct std::less<int>,clas
s std::allocator<struct std::pair<int const ,int> >,0> >::_Node    76  16.8%
1824   4.1%
class std::vector<class std::basic_string<char,struct std::char_traits<char>,cla
ss std::allocator<char> >,class std::allocator<class std::basic_string<char,stru
ct std::char_traits<char>,class std::allocator<char> > > >    37   8.2%     740
  1.7%
class Poco::Data::ODBC::ODBCStatementImpl              1   0.2%     352   0.8%
class Poco::Data::ODBC::Binder                         1   0.2%     352   0.8%
struct std::_Tree_nod<class std::_Tmap_traits<class std::basic_string<char,struc
t std::char_traits<char>,class std::allocator<char> >,struct Poco::Data::Abstrac
tSessionImpl<class Poco::Data::ODBC::SessionImpl>::Feature,struct std::less<clas
s std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> > const ,struct Poco::Data::Ab
stractSessionImpl<class Poco::Data::ODBC::SessionImpl>::Feature> >,0> >::_Node
   6   1.3%     336   0.8%
class Poco::Data::ODBC::SessionImpl                    1   0.2%     304   0.7%
struct std::_Tree_nod<class std::_Tmap_traits<class std::basic_string<char,struc
t std::char_traits<char>,class std::allocator<char> >,struct Poco::Data::Abstrac
tSessionImpl<class Poco::Data::ODBC::SessionImpl>::Property,struct std::less<cla
ss std::basic_string<char,struct std::char_traits<char>,class std::allocator<cha
r> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct
 std::char_traits<char>,class std::allocator<char> > const ,struct Poco::Data::A
bstractSessionImpl<class Poco::Data::ODBC::SessionImpl>::Property> >,0> >::_Node
     5   1.1%     280   0.6%
class Poco::ReferenceCounter                          45  10.0%     180   0.4%
struct std::_Tree_nod<class std::_Tmap_traits<class std::basic_string<char,struc
t std::char_traits<char>,class std::allocator<char> >,struct Poco::Data::Session
Factory::SessionInfo,struct Poco::CILess,class std::allocator<struct std::pair<c
lass std::basic_string<char,struct std::char_traits<char>,class std::allocator<c
har> > const ,struct Poco::Data::SessionFactory::SessionInfo> >,0> >::_Node
2   0.4%     120   0.3%
class Poco::Data::ODBC::Preparator                     1   0.2%     116   0.3%
class Poco::Data::Binding<int>                         1   0.2%      64   0.1%
class Poco::Data::ODBC::Extractor                      1   0.2%      40   0.1%
class Poco::Data::ODBC::EnvironmentHandle              1   0.2%       8   0.0%
class Poco::Any::Holder<void *>                        1   0.2%       8   0.0%
class Poco::Any::Holder<unsigned int>                  1   0.2%       8   0.0%
class Poco::Data::SQLite::Connector                    1   0.2%       4   0.0%
class Poco::Data::ODBC::Connector                      1   0.2%       4   0.0%
--------                                           -----        -------
[totals]                                             452          44068

-----------------------
Memory Usage Statistics
-----------------------

allocated type                                    blocks          bytes
--------------                                    ------          -----
struct std::_Tree_nod<class std::_Tmap_traits<int,int,struct std::less<int>,clas
s std::allocator<struct std::pair<int const ,int> >,0> >::_Node    38  64.4%
 912  54.9%
[unknown]                                             15  25.4%     612  36.9%
struct std::_Tree_nod<class std::_Tmap_traits<class std::basic_string<char,struc
t std::char_traits<char>,class std::allocator<char> >,struct Poco::Data::Session
Factory::SessionInfo,struct Poco::CILess,class std::allocator<struct std::pair<c
lass std::basic_string<char,struct std::char_traits<char>,class std::allocator<c
har> > const ,struct Poco::Data::SessionFactory::SessionInfo> >,0> >::_Node
2   3.4%     120   7.2%
class Poco::ReferenceCounter                           2   3.4%       8   0.5%
class Poco::Data::SQLite::Connector                    1   1.7%       4   0.2%
class Poco::Data::ODBC::Connector                      1   1.7%       4   0.2%
--------                                           -----        -------
[totals]                                              59           1660
alex
 
Posts: 1101
Joined: 11 Jul 2006, 16:27
Location: United_States

Previous

Return to Support

Who is online

Users browsing this forum: No registered users and 4 guests