Discussion:
Corruption in C++ constructor
(too old to reply)
navin p
2014-08-14 16:18:07 UTC
Permalink
Hi,
Sorry for the long post but i'm stuck . Can someone help me ?

I'm debugging a multithreaded program. I've inlined the headerfile below.
Now when i print selectConstruct i get all the vectors with M_start as 0 .

Now when i call the constructor ie when the selectConstruct is passed
by value to the function fetch_custom_sql_query to create a temporary
object it changes the M_start and M_finish as below in the second
snapshot print *this.

As you can see limit is -1 but it is corrupted after the call to
constructor ie p *this.

Is this a corruption , how do i debug this ?

2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) p selectConstruct
$1 = {distinct = false, colsToBeSelected = {cols =
{<std::_Vector_base<dbCol, std::allocator<dbCol> >> = {_M_impl =
{<std::allocator<dbCol>> = {<__gnu_cxx::new_allocator<dbCol>> = {<No
data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}}, tableName = {static
npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> =
{<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data
fields>}, _M_p = 0x3dd36f32d8 ""}}, where = {whereExprs =
{<std::_Vector_base<whereExpr, std::allocator<whereExpr> >> = {_M_impl
= {<std::allocator<whereExpr>> =
{<__gnu_cxx::new_allocator<whereExpr>> = {<No data fields>}, <No data
fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}},
<No data fields>}, ops = {<std::_Vector_base<adjoinOperator,
std::allocator<adjoinOperator> >> = {_M_impl =
{<std::allocator<adjoinOperator>> =
{<__gnu_cxx::new_allocator<adjoinOperator>> = {<No data fields>}, <No
data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage =
0x0}}, <No data fields>}, namespaceCounts =
{<std::_Vector_base<unsigned int, std::allocator<unsigned int> >> =
{_M_impl = {<std::allocator<unsigned int>> =
{<__gnu_cxx::new_allocator<unsigned int>> = {<No data fields>}, <No
data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage =
0x0}}, <No data fields>}, useAsON = false}, groupBy = {cols =
{<std::_Vector_base<dbCol, std::allocator<dbCol> >> = {_M_impl =
{<std::allocator<dbCol>> = {<__gnu_cxx::new_allocator<dbCol>> = {<No
data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}}, orders = {orders =
{<std::_Vector_base<orderingTerm, std::allocator<orderingTerm> >> =
{_M_impl = {<std::allocator<orderingTerm>> =
{<__gnu_cxx::new_allocator<orderingTerm>> = {<No data fields>}, <No
data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage =
0x0}}, <No data fields>}}, limit = -1}
(gdb) stepi
0x00007ffff0df9b49 2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) stepi
0x00007ffff0df9b50 2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) stepi
0x00007ffff0df9b53 2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) stepi
0x00007ffff0df9b5b 2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) stepi
0x00007ffff0df9b5e 2873 int rc =
_db->fetch_custom_sql_query(rwc.GetQueryName(),selectConstruct,
HandleCustomSqlQueryResponse, (void*)&holder);
(gdb) stepi
0x00007ffff0da8000 in simpleSelectConstruct::simpleSelectConstruct ()
from /opt/OV/lbin/OpsAgt/libDMLSegment.so
(gdb) stepi
simpleSelectConstruct::simpleSelectConstruct (this=0x7fffdbffdbb0) at
/home/parakkal/COLLABNET_11.10_NEW/hpsw-oa/AgentFramework/cpp/src/include/OpsAgt/DBsupports.h:170
170 class simpleSelectConstruct{
/include/OpsAgt/DBsupports.h:170
170 class simpleSelectConstruct{
(gdb) p *this
$2 = {distinct = false, colsToBeSelected = {cols =
{<std::_Vector_base<dbCol, std::allocator<dbCol> >> = {_M_impl =
{<std::allocator<dbCol>> = {<__gnu_cxx::new_allocator<dbCol>> = {<No
data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}}, tableName = {static
npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> =
{<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data
fields>}, _M_p = 0x0}}, where = {whereExprs =
{<std::_Vector_base<whereExpr, std::allocator<whereExpr> >> = {_M_impl
= {<std::allocator<whereExpr>> =
{<__gnu_cxx::new_allocator<whereExpr>> = {<No data fields>}, <No data
fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}},
<No data fields>}, ops = {<std::_Vector_base<adjoinOperator,
std::allocator<adjoinOperator> >> = {_M_impl =
{<std::allocator<adjoinOperator>> =
{<__gnu_cxx::new_allocator<adjoinOperator>> = {<No data fields>}, <No
data fields>}, _M_start = 0x0, _M_finish = 0x3dd34bd704,
_M_end_of_storage = 0x7ffff7ca52b0}}, <No data fields>},
namespaceCounts = {<std::_Vector_base<unsigned int,
std::allocator<unsigned int> >> = {_M_impl = {<std::allocator<unsigned
int>> = {<__gnu_cxx::new_allocator<unsigned int>> = {<No data
fields>}, <No data fields>}, _M_start = 0x7fffdbffe910, _M_finish =
0x6, _M_end_of_storage = 0x4e}}, <No data fields>}, useAsON = false},
groupBy = {cols = {<std::_Vector_base<dbCol, std::allocator<dbCol> >>
= {_M_impl = {<std::allocator<dbCol>> =
{<__gnu_cxx::new_allocator<dbCol>> = {<No data fields>}, <No data
fields>}, _M_start = 0x7fffdbffe910, _M_finish = 0x0,
_M_end_of_storage = 0x7ffff6f54d1f}}, <No data fields>}}, orders =
{orders = {<std::_Vector_base<orderingTerm,
std::allocator<orderingTerm> >> = {_M_impl =
{<std::allocator<orderingTerm>> =
{<__gnu_cxx::new_allocator<orderingTerm>> = {<No data fields>}, <No
data fields>}, _M_start = 0x7ffff7ca52b0, _M_finish = 0x7ffff6f5584d,
_M_end_of_storage = 0x5509f0}}, <No data fields>}}, limit =
-603988688}
(gdb) stepi
0x00007ffff0e11892 170 class simpleSelectConstruct{
(gdb) stepi
0x00007ffff0e11894 170 class simpleSelectConstruct{
(gdb) stepi
0x00007ffff0e11896 170 class simpleSelectConstruct{
(gdb) stepi
0x00007ffff0e11898 170 class simpleSelectConstruct{
(gdb) p *this
$3 = {distinct = false, colsToBeSelected = {cols =
{<std::_Vector_base<dbCol, std::allocator<dbCol> >> = {_M_impl =
{<std::allocator<dbCol>> = {<__gnu_cxx::new_allocator<dbCol>> = {<No
data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0,
_M_end_of_storage = 0x0}}, <No data fields>}}, tableName = {static
npos = 18446744073709551615, _M_dataplus = {<std::allocator<char>> =
{<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data
fields>}, _M_p = 0x0}}, where = {whereExprs =
{<std::_Vector_base<whereExpr, std::allocator<whereExpr> >> = {_M_impl
= {<std::allocator<whereExpr>> =
{<__gnu_cxx::new_allocator<whereExpr>> = {<No data fields>}, <No data
fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}},
<No data fields>}, ops = {<std::_Vector_base<adjoinOperator,
std::allocator<adjoinOperator> >> = {_M_impl =
{<std::allocator<adjoinOperator>> =
{<__gnu_cxx::new_allocator<adjoinOperator>> = {<No data fields>}, <No
data fields>}, _M_start = 0x0, _M_finish = 0x3dd34bd704,
_M_end_of_storage = 0x7ffff7ca52b0}}, <No data fields>},
namespaceCounts = {<std::_Vector_base<unsigned int,
std::allocator<unsigned int> >> = {_M_impl = {<std::allocator<unsigned
int>> = {<__gnu_cxx::new_allocator<unsigned int>> = {<No data
fields>}, <No data fields>}, _M_start = 0x7fffdbffe910, _M_finish =
0x6, _M_end_of_storage = 0x4e}}, <No data fields>}, useAsON = false},
groupBy = {cols = {<std::_Vector_base<dbCol, std::allocator<dbCol> >>
= {_M_impl = {<std::allocator<dbCol>> =
{<__gnu_cxx::new_allocator<dbCol>> = {<No data fields>}, <No data
fields>}, _M_start = 0x7fffdbffe910, _M_finish = 0x0,
_M_end_of_storage = 0x7ffff6f54d1f}}, <No data fields>}}, orders =
{orders = {<std::_Vector_base<orderingTerm,
std::allocator<orderingTerm> >> = {_M_impl =
{<std::allocator<orderingTerm>> =
{<__gnu_cxx::new_allocator<orderingTerm>> = {<No data fields>}, <No
data fields>}, _M_start = 0x7ffff7ca52b0, _M_finish = 0x7ffff6f5584d,
_M_end_of_storage = 0x5509f0}}, <No data fields>}}, limit =
-603988688}
(gdb)


#ifndef my_db_supports_h
#define my_db_supports_h

#include <string>
#include <vector>
namespace std {}
using namespace std;

#include "OvXplStr/NlString.h"

#if defined(WINDOWS)
#if defined(EXPORT_LIB)
#define DBSupportsInterface __declspec(dllexport)
#else
#define DBSupportsInterface //__declspec(dllimport)
#endif
#else
#define DBSupportsInterface
#endif

typedef enum
{
data_type_integer = 0,
data_type_text,
data_type_real,
data_type_numeric,
data_type_time,
data_type_autokey,
data_type_none
} db_ColumnDataType;

typedef enum
{
ascending = 0,
descending
} order_e;

typedef enum
{
is_equal_to = 0,
is_not_equal_to,
is_greater_than,
is_greater_than_or_equal,
is_less_than,
is_less_than_or_equal,
is_in
} whereOperator;

typedef enum
{
_AND_ = 100,
_OR_
} adjoinOperator;

class dbColumnDef {

protected:
OvXplStr::String_t name;
db_ColumnDataType type;
bool isPartOfPrimaryKey;
int isPartOfUniqueness;
bool isForeignKey;
OvXplStr::String_t foreignTableName;
OvXplStr::String_t foreignColumnName;

public:

DBSupportsInterface dbColumnDef();
DBSupportsInterface dbColumnDef(const dbColumnDef & _dbCol);
DBSupportsInterface void setName(OvXplStr::String_t _name);
DBSupportsInterface void setType(db_ColumnDataType _type);
DBSupportsInterface void setIsPartOfPrimaryKey(bool _v);
DBSupportsInterface void setIsPartOfUniqueness(int _v);
DBSupportsInterface void setForeignKeyReference(OvXplStr::String_t
_fTableName, OvXplStr::String_t _fColName);

DBSupportsInterface OvXplStr::String_t getName();
DBSupportsInterface db_ColumnDataType getType();
DBSupportsInterface bool getIsPartOfPrimaryKey();
DBSupportsInterface int getIsPartOfUniqueness();
DBSupportsInterface bool getIsForeignKey();
DBSupportsInterface OvXplStr::String_t getForeignTableName();
DBSupportsInterface OvXplStr::String_t getForeignColumnName();

};

class dbColumnDefs{
private:
vector<dbColumnDef> cols;

public:
DBSupportsInterface void addColumnDef(dbColumnDef _col);
DBSupportsInterface dbColumnDef& getColumnDefAt(int i);
DBSupportsInterface int getNumColumnDefs();
};

class dbCol{
public:
OvXplStr::String_t colName;
db_ColumnDataType type;
DBSupportsInterface dbCol();
};

class dbColValue: public dbCol{
public:
OvXplStr::String_t value;
DBSupportsInterface dbColValue();
};

class dbColValues{

protected:
vector<dbColValue> vals;

public:
DBSupportsInterface void addValue(dbColValue _val);
DBSupportsInterface dbColValue & getValueAt(int i);
DBSupportsInterface int getNumValues();
};

class dbCols{

protected:
vector<dbCol> cols;

public:
DBSupportsInterface void addColumn(dbCol _val);
DBSupportsInterface dbCol & getColumnAt(int i);
DBSupportsInterface int getNumColumns();
};

class whereExpr{
public:
dbCol col;
whereOperator op;
OvXplStr::String_t value;
vector<OvXplStr::String_t> is_in_list;
};

class orderingTerm{
public:
dbCol col;
order_e order;
};

class orderBy{
public:
vector<orderingTerm> orders;
DBSupportsInterface void addOrder(orderingTerm _o);
OvXplStr::String_t getOrderByConstruct();
};

class whereConstruct{
protected:
vector<whereExpr> whereExprs;
vector<adjoinOperator> ops;
vector<unsigned int> namespaceCounts;
bool useAsON;
public:
DBSupportsInterface whereConstruct(bool b = false) {
useAsON=b;
}
DBSupportsInterface void addWhereExpr(whereExpr _w);
DBSupportsInterface void addAdjoiningOp(adjoinOperator _op);
DBSupportsInterface void addNameSpaceBoundary(unsigned int);
DBSupportsInterface OvXplStr::String_t getWhereConstruct();
DBSupportsInterface size_t getNumWhereExprs();
DBSupportsInterface bool UseAsON();
};

class simpleSelectConstruct{

public:
DBSupportsInterface simpleSelectConstruct()
{
distinct=false;
limit=-1;
}
bool distinct;
dbCols colsToBeSelected;
string tableName;
whereConstruct where;
dbCols groupBy;
orderBy orders;
int limit;
};

class dbUtils
{
public:
static OvXplStr::String_t makeEscapedString(OvXplStr::String_t
unEscapedStr);
};

#endif /* my_db_supports_h */
Jonathan Wakely
2014-08-14 17:20:08 UTC
Permalink
Post by navin p
Is this a corruption , how do i debug this ?
You can try rebuilding your code with -D_GLIBCXX_DEBUG compiler
option, which turns on debugging checks in the C++ standard library.
That might reveal a bug in your code.

You could also try using the sanitizer features in recent versions of GCC.
Loading...