0

我在 linux 环境中的 C++ 项目(使用 GCC 4.8.1 编译)中使用 mysql++ 库(v3.1.0),并有一个 ssqls 对象作为session_data我创建的类的类成员()(Session)。一切正常,直到我的类的一个实例被破坏,此时一个std::string对象似乎试图释放一些它没有的内存,导致内核介入。下面是 GDB 给出的堆栈跟踪的一部分失败。

#2  0x00c143ea in abort () from /lib/libc.so.6
#3  0x00c529d5 in __libc_message () from /lib/libc.so.6
#4  0x00c58e31 in malloc_printerr () from /lib/libc.so.6
#5  0x00c5b571 in _int_free () from /lib/libc.so.6
#6  0x0810e43f in operator delete(void*) () at ../../../../gcc-4.8.1/libstdc++-v3/libsupc++/del_op.cc:47
#7  0x081518eb in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::allocator<char> const&) ()
    at /include/ext/new_allocator.h:110
#8  0x08151930 in std::string::_Rep::_M_dispose ()
    at /include/bits/basic_string.h:249
#9  0x0815199e in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() ()
    at /include/bits/basic_string.h:539
#10 0x080ac492 in session_data::~session_data() ()
    at sql_tables.h:80
#11 0x080ac537 in Session::~Session() ()
    at session.cpp:5

所有这些析构函数似乎都是即时创建的,因为我无法在其中设置断点,因为根据 GDB,它们不存在。就个人而言,我怀疑这是 GCC 生成的代码中的错误,这让我假设我以某种方式“虐待”了 ssqls 对象。到目前为止,我在一个较小的项目中重现错误的努力都失败了,但如果我确实做到了,我一定会在此处发布该代码。真的,我想知道是否有人知道可能导致此问题的 ssqls 对象内部发生了什么,同时我将继续尝试调试该问题。

用最少的代码编辑。 session_data完全由 ssqls 宏定义,我这样称呼它:

sql_create_7(session_data,      4,7,    sql_varchar,    id,
                    sql_text,   last_ip,
                    sql_text,   last_user_agent,
                    sql_datetime,   expires,
                    sql_text,   account,
                    sql_text,   messages,
                    sql_text,   login_key)

该类通过以下方式Session填充值session_data

mysqlpp::StoreQueryResult res=query.store();
session=res[0];

session_data session作为一个类成员和query一个 mysql++ 查询对象,它确实有来自数据库的数据)有时session它的值可能会被行更改session=tmp;(其中 tmp 是另一个 session_data 对象)。在所有其他情况下,其中的变量session都是按值使用的,例如 in session.account,所以我认为它们不应该引起问题。希望这对人们有更多帮助。

4

1 回答 1

1

我的心理调试技能告诉我,您的Session对象被双重删除,或者它没有正确实施规则(0、3、5)并且它的一个成员被双重删除(很可能是在被浅拷贝之后或分配)。

于 2013-12-09T21:16:25.317 回答