stringstream - ошибка сегментации

Модератор: Модераторы разделов

Gregory
Сообщения: 3
ОС: Mandriva Linux 2008.1

stringstream - ошибка сегментации

Сообщение Gregory »

Доброго времени суток.
прграмма падает

Код: Выделить всё

*** glibc detected *** ../bin/linux/dbsynchr: free(): invalid next size (normal): 0x0935c0c0 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb7b5a624]
/lib/i686/cmov/libc.so.6(cfree+0x96)[0xb7b5c826]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7d332e1]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xb7d0fb2d]
/usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x51)[0xb7d11501]
../bin/linux/dbsynchr[0x804bb32]
../bin/linux/dbsynchr[0x8050690]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7b02455]
../bin/linux/dbsynchr(_ZNSt8ios_base4InitD1Ev+0x31)[0x8049b41]

Код: Выделить всё

class Database
{
  public:
    Database();
    Database( const std::string& host ,
              const std::string& user ,
              const std::string& password);
    ~Database();
    bool add_table(const std::string& , const std::string& );
    bool add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id);
    bool get_next_value( const std::string& , const std::string& , std::string& , long& );
    long get_num_rows(const std::string& db, const std::string& table);
    int get_idx_id( const std::string& base, const std::string& table, const long& doc_id );
  private:
    inline void close_connection();
    bool connect(const std::string& ="localhost", const std::string& ="root", const std::string& ="");
    void set_db( const std::string& );
    MYSQL* mysql;
};

bool Database::add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id)
    {
.......
                idx_id=get_idx_id(base,table,doc_id);
                std::string query;
                std::ostringstream s;
                char* v;
                int length=value.length();
                v=new char[length+10];

                mysql_escape_string(v,value.c_str(),length);
                printf("%s\n",v);
                s<<"REPLACE IDX"<<table<<" VALUES ( "<<idx_id<<" , '"<<v<<"')";//на этой строке valgrind пишет ошибку
........
}

прогнал через валгринд, получил следующее:

Код: Выделить всё

--14058-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--14058-- si_code=1;  Faulting address: 0xEA815936;  sp: 0x627A3E98

valgrind: the 'impossible' happened:
   Killed by fatal signal
==14058==    at 0x38023926: vgPlain_arena_malloc (m_mallocfree.c:206)
==14058==    by 0x38002BA0: vgMemCheck_new_block (mc_malloc_wrappers.c:195)
==14058==    by 0x38002FCD: vgMemCheck___builtin_new (mc_malloc_wrappers.c:237)
==14058==    by 0x38039072: vgPlain_scheduler (scheduler.c:1269)
==14058==    by 0x3804D2D8: run_a_thread_NORETURN (syswrap-linux.c:89)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable
==14058==    at 0x402377E: operator new(unsigned) (vg_replace_malloc.c:224)
==14058==    by 0x42B7C03: std::string::_Rep::_S_create(unsigned, unsigned, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B8677: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B96DF: std::string::reserve(unsigned) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B28E4: std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B7141: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42AD369: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42AD52B: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x804BA2D: Database::add_value(std::string const&, std::string const&, std::string const&, long const&) (database.cpp:318)
==14058==    by 0x805068F: main (in /home/gregory/develop/biblio/bin/linux/dbsynchr)

строка (которая value) на которой падает -
Cтор. А: Весна: \"Зонтики\"(фрагм.) / муз. В. Дыбский ; \"Солнечная капель\" / муз. С. Соснина ; сл. И. Вахрушевой ; исп. А. Железкова ; \"Песенка-чудесенка\" / муз. М. Протасова ; исп. А. Железкова ; Кукол. спектакль \"Капризка\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Зонтики\" / муз. В. Дыбского ; Минус. фоногр. песен: \"Солнечная капель\", \"Песенка-чудесенка\". Лето: \"Радуга\" / муз. О. Юдахина ; сл. В. Ключникова ; \"Соломенное лето\" / муз. О. Юдахина ; сл. В. Степанова ; Кукол. спектакль \"Огородники\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Вы больше конфеты мне не дарите\" / муз. О. Поляковой ; сл. Э. Машковской ; Минус фоногр.песен: \"Радуга\", \"Соломенное лето\", \"Вы больше конфеты мне не дарите\". Стор. В: Осень: \"Осенние дорожки\" / муз. О. Поляковой ; сл. В. Орлова ; \"Осень постучалась к нам\" / муз. И. Смирновой ; сл. Т. Прописновой ; \"Осень наступила\" / исп. С. Харлап ; \"Дружат дети всей земли\" / муз. Д. Львова-Компанееца ; Минус. фоногр. песен: \"Осенние дорожки\", \"Осень постучала к нам\", \"Осень наступила\". Зима: \"Дед Мороз\" / муз. О. Поляковой ; сл. З. Александровой ; \"Танцуйте с нами\" / муз. и сл. Т. Дикаревой ; Кукол. спектакль \"Волшебная сметана\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Зима\" / муз. В. Шошина ; Минус. фоногр. песен: \"Дед Мороз\", \"Танцуйте с нами\"

Подскажите, пожалуйста, что я делаю не так и куда копать.
Спасибо сказали:
Аватара пользователя
gramozeka
Сообщения: 204
ОС: Slackware-14

Re: stringstream - ошибка сегментации

Сообщение gramozeka »

Gregory писал(а): ↑
10.02.2010 19:48
Доброго времени суток.
прграмма падает с ошибкой сегментации

Код: Выделить всё

class Database
{
  public:
    Database();
    Database( const std::string& host ,
              const std::string& user ,
              const std::string& password);
    ~Database();
    bool add_table(const std::string& , const std::string& );
    bool add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id);
    bool get_next_value( const std::string& , const std::string& , std::string& , long& );
    long get_num_rows(const std::string& db, const std::string& table);
    int get_idx_id( const std::string& base, const std::string& table, const long& doc_id );
  private:
    inline void close_connection();
    bool connect(const std::string& ="localhost", const std::string& ="root", const std::string& ="");
    void set_db( const std::string& );
    MYSQL* mysql;
};

bool Database::add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id)
    {
.......
                idx_id=get_idx_id(base,table,doc_id);
                std::string query;
                std::ostringstream s;
                char* v;
                int length=value.length();
                v=new char[length+10];

                mysql_escape_string(v,value.c_str(),length);
                printf("%s\n",v);
                s<<"REPLACE IDX"<<table<<" VALUES ( "<<idx_id<<" , '"<<v<<"')";//на этой строке valgrind пишет ошибку
........
}

прогнал через валгринд, получил следующее:

Код: Выделить всё

--14058-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--14058-- si_code=1;  Faulting address: 0xEA815936;  sp: 0x627A3E98

valgrind: the 'impossible' happened:
   Killed by fatal signal
==14058==    at 0x38023926: vgPlain_arena_malloc (m_mallocfree.c:206)
==14058==    by 0x38002BA0: vgMemCheck_new_block (mc_malloc_wrappers.c:195)
==14058==    by 0x38002FCD: vgMemCheck___builtin_new (mc_malloc_wrappers.c:237)
==14058==    by 0x38039072: vgPlain_scheduler (scheduler.c:1269)
==14058==    by 0x3804D2D8: run_a_thread_NORETURN (syswrap-linux.c:89)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable
==14058==    at 0x402377E: operator new(unsigned) (vg_replace_malloc.c:224)
==14058==    by 0x42B7C03: std::string::_Rep::_S_create(unsigned, unsigned, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B8677: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B96DF: std::string::reserve(unsigned) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B28E4: std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42B7141: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42AD369: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x42AD52B: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/libstdc++.so.6.0.10)
==14058==    by 0x804BA2D: Database::add_value(std::string const&, std::string const&, std::string const&, long const&) (database.cpp:318)
==14058==    by 0x805068F: main (in /home/gregory/develop/biblio/bin/linux/dbsynchr)

строка (которая value) на которой падает -
Cтор. А: Весна: \"Зонтики\"(фрагм.) / муз. В. Дыбский ; \"Солнечная капель\" / муз. С. Соснина ; сл. И. Вахрушевой ; исп. А. Железкова ; \"Песенка-чудесенка\" / муз. М. Протасова ; исп. А. Железкова ; Кукол. спектакль \"Капризка\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Зонтики\" / муз. В. Дыбского ; Минус. фоногр. песен: \"Солнечная капель\", \"Песенка-чудесенка\". Лето: \"Радуга\" / муз. О. Юдахина ; сл. В. Ключникова ; \"Соломенное лето\" / муз. О. Юдахина ; сл. В. Степанова ; Кукол. спектакль \"Огородники\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Вы больше конфеты мне не дарите\" / муз. О. Поляковой ; сл. Э. Машковской ; Минус фоногр.песен: \"Радуга\", \"Соломенное лето\", \"Вы больше конфеты мне не дарите\". Стор. В: Осень: \"Осенние дорожки\" / муз. О. Поляковой ; сл. В. Орлова ; \"Осень постучалась к нам\" / муз. И. Смирновой ; сл. Т. Прописновой ; \"Осень наступила\" / исп. С. Харлап ; \"Дружат дети всей земли\" / муз. Д. Львова-Компанееца ; Минус. фоногр. песен: \"Осенние дорожки\", \"Осень постучала к нам\", \"Осень наступила\". Зима: \"Дед Мороз\" / муз. О. Поляковой ; сл. З. Александровой ; \"Танцуйте с нами\" / муз. и сл. Т. Дикаревой ; Кукол. спектакль \"Волшебная сметана\" / авт.: Т. Караманенко, Ю. Караманенко ; исп. С. Харлап ; \"Зима\" / муз. В. Шошина ; Минус. фоногр. песен: \"Дед Мороз\", \"Танцуйте с нами\"

Подскажите, пожалуйста, что я делаю не так.


.................................
для подобных проектов очень удобен графический отладчик , в приведенном фрагменте
три ошибки :

Код: Выделить всё


...............
.........
  MYSQL* mysql;
..........

main.cpp:23: ошибка: ISO C++ запрещает декларации ‘MYSQL’ без типа
main.cpp:23: ошибка: expected ‘;’ before ‘*’ token

Код: Выделить всё

bool Database::add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id)
        {
    .......
                    idx_id=get_idx_id(base,table,doc_id);
                    std::string query;
                    std::ostringstream s;
                    char* v;
                    int length=value.length();
                    v=new char[length+10];

                    mysql_escape_string(v,value.c_str(),length);
                    printf("%s\n",v);
                    s<<"REPLACE IDX"<<table<<" VALUES ( "<<idx_id<<" , '"<<v<<"')";//на этой строке valgrind пишет ошибку
    ........

}main.cpp:27: ошибка: a function-definition is not allowed here before ‘{’ token
хотя последняя зависит от общего контекста программы ...
... я надеюсь вам поможет .
... ну я же просил четыреста капель , а сдесь четыреста две ...
Спасибо сказали:
Gregory
Сообщения: 3
ОС: Mandriva Linux 2008.1

Re: stringstream - ошибка сегментации

Сообщение Gregory »

.................................
для подобных проектов очень удобен графический отладчик , в приведенном фрагменте
три ошибки :

Код: Выделить всё


...............
.........
  MYSQL* mysql;
..........

main.cpp:23: ошибка: ISO C++ запрещает декларации ‘MYSQL’ без типа
main.cpp:23: ошибка: expected ‘;’ before ‘*’ token

Код: Выделить всё

bool Database::add_value(const std::string& base, const std::string& table, const std::string& value, const long& doc_id)
        {
    .......
                    idx_id=get_idx_id(base,table,doc_id);
                    std::string query;
                    std::ostringstream s;
                    char* v;
                    int length=value.length();
                    v=new char[length+10];

                    mysql_escape_string(v,value.c_str(),length);
                    printf("%s\n",v);
                    s<<"REPLACE IDX"<<table<<" VALUES ( "<<idx_id<<" , '"<<v<<"')";//на этой строке valgrind пишет ошибку
    ........

}main.cpp:27: ошибка: a function-definition is not allowed here before ‘{’ token
хотя последняя зависит от общего контекста программы ...
... я надеюсь вам поможет .

Спасибо, gramozeka, но программа использует библиотеку libmysqlclient (MySQL C API) - тип MYSQL там объявлен.
Здесь я привёл только часть кода проекта, на котором возникает ошибка. Нужен весь код?
Спасибо сказали:
Gregory
Сообщения: 3
ОС: Mandriva Linux 2008.1

Re: stringstream - ошибка сегментации

Сообщение Gregory »

Проблема решена, не посмотрел что mysql_escape_string() экранирует в том числе двойные кавычки. По-хорошему, размер массива v должен быть
2*length+1
Спасибо сказали:
Аватара пользователя
gramozeka
Сообщения: 204
ОС: Slackware-14

Re: stringstream - ошибка сегментации

Сообщение gramozeka »

нет , весь код не нужен , ( просто нет времени ) , но таки попробуйте графический отладчик (хоть тот же :Qt 4.5.2) весит не много , для работы требует минимум , устанавливается run-файлом изолированно , так же удаляется , по крайней мере избавит вас от гемороя поиска ошибок синтаксиса .
Где то запятую пропустил или скобку не там поставил - ищи её потом ...
... ну я же просил четыреста капель , а сдесь четыреста две ...
Спасибо сказали: