|
From: Simon W. <si...@gi...> - 2012-06-06 05:44:30
|
Hi,
I have here a very simple test program that crashes with a SIGSEGV. When
running it through valgrind, it shows memory leaks.
I've written this piece of code as I am having trouble with a larger
project. However, I think I've isolated it to libodbc++ or unixodbc.
I initially used std::unique_ptr. But thought I'd try plain old pointers
for this test. Either way, there are probelms.
Here is the program:
---------------------------------------
#include <string>
#include <sstream>
#include <iostream>
#include <odbc++/drivermanager.h>
#include <odbc++/connection.h>
#include <odbc++/preparedstatement.h>
#include <odbc++/callablestatement.h>
#include <odbc++/resultset.h>
#include <odbc++/databasemetadata.h>
#include <odbc++/resultsetmetadata.h>
int main(int argc, char** argv)
{
int test;
std::string dbConnectString = "DSN=agentportal;USER=xxx;PASSWORD=xxx";
std::stringstream query;
query << "select sleep(" << 30 << "), 1 as test";
try
{
odbc::Connection* connection =
odbc::DriverManager::getConnection(dbConnectString);
odbc::Statement* statement = connection->createStatement();
odbc::ResultSet* resultSet = statement->executeQuery(query.str());
while (resultSet->next())
{
test = resultSet->getInt("test");
}
delete connection;
delete statement;
delete resultSet;
}
catch(odbc::SQLException& e)
{
std::cout << std::endl << "error code: "<< e.getErrorCode() <<
std::endl << "error message: " << e.getMessage() << std::endl;
}
return 0;
}
---------------------------------------
#include <string>
#include <sstream>
#include <iostream>
#include <memory>
#include <odbc++/drivermanager.h>
#include <odbc++/connection.h>
#include <odbc++/preparedstatement.h>
#include <odbc++/callablestatement.h>
#include <odbc++/resultset.h>
#include <odbc++/databasemetadata.h>
#include <odbc++/resultsetmetadata.h>
int main(int argc, char** argv)
{
int test;
std::string dbConnectString = "DSN=agentportal;USER=xxx;PASSWORD=xxx";
std::stringstream query;
query << "select 1 as test";
try
{
std::unique_ptr<odbc::Connection> connection
(odbc::DriverManager::getConnection(dbConnectString));
std::unique_ptr<odbc::Statement> statement
(connection->createStatement());
std::unique_ptr<odbc::ResultSet> resultSet
(statement->executeQuery(query.str()));
while (resultSet->next())
{
test = resultSet->getInt("test");
}
std::cout << test << std::endl;
}
catch(odbc::SQLException& e)
{
std::cout << std::endl << "error code: "<< e.getErrorCode() <<
std::endl << "error message: " << e.getMessage() << std::endl;
}
return 0;
}
---------------------------------------
(gdb) r
Starting program: /home/weelz/htserve/trunk/testODBC
[Thread debugging using libthread_db enabled]
[New Thread 0xb799cb70 (LWP 7865)]
[Thread 0xb799cb70 (LWP 7865) exited]
Program received signal SIGSEGV, Segmentation fault.
0x00000489 in ?? ()
(gdb) bt
#0 0x00000489 in ?? ()
#1 0xb7d18ca6 in __libc_start_main (main=0x8048e64 <main>, argc=1,
ubp_av=0xbffff7a4, init=0x8049230 <__libc_csu_init>, fini=0x8049220
<__libc_csu_fini>, rtld_fini=0xb7ff1380 <_dl_fini>, stack_end=0xbffff79c)
at libc-start.c:228
#2 0x08048dd1 in _start ()
(gdb)
---------------------------------------
I've attached the valgrind output as it is rather long. prt.log is for
the plain pointer version up top. unique.log is for the version that
uses unique_ptr. Admittedly, the unique_ptr behaves better, but still
has issues.
I suspect I am doing something wrong when compiling libodbc++ rather
than there is a bug. I see the similar behavior with TDS as well.
Short of building everything from source (gentoo?), I thought I'd see if
anyone has any ideas on what could be the problem.
Has anyone run into similar issues?
Thanks,
Simon
--
simonsmicrophone.com
|