Форум программистов, компьютерный форум CyberForum.ru

Вылетает на std::length_error exception - C++

Восстановить пароль Регистрация
 
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 17:49     Вылетает на std::length_error exception #1
название не очень отражает суть вопроса, но лучше я предумать не смог.
Есть программа собранная в дебаге (-g) к ней линкуется только одна библиотека libmysql.lib которая написана на Си и не знает что такое std::string, и вот эта программа время от времени вылетает на std::lenth_error exception который кидает string::append, но дебагер не может дать подробной информации почему и где это происходит (скрины ниже).
Вопрос №1: почему программа собранная в дебаге не может дать нормальной информации про call stack?
№2: что делать в таких случаях, как искать ошибку?
Миниатюры
Вылетает на std::length_error exception   Вылетает на std::length_error exception  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
05.09.2014, 18:05     Вылетает на std::length_error exception #2
А при чём тут библиотека, если исключение происходит в самой программе?

Добавлено через 9 минут
Используя try/catch поймай исключение, выведи на экран номер строки __LINE__ и имя функции __FUNCTION__\__PRETTY_FUNCTION__.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:05  [ТС]     Вылетает на std::length_error exception #3
castaway, я же и написал что библиотека тут не при чём, тогда почему я не получаю нормальных данных если программа собрана с флагом -g? Много других проблем и эксепшенов дебагер показывал нормально, а вот с этой беда.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
05.09.2014, 18:10     Вылетает на std::length_error exception #4
Это тема про дебагер или про то как исправить ошибку?
Если про то как найти и исправить, тогда try/catch.
+ код тут точно не помешает.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:29  [ТС]     Вылетает на std::length_error exception #5
Цитата Сообщение от castaway Посмотреть сообщение
Если про то как найти и исправить, тогда try/catch.
Хотя да, это вариант, попробую
Цитата Сообщение от castaway Посмотреть сообщение
+ код тут точно не помешает.
да я бы не против, но там уже 19 файлов и 1413 строк чистого кода, я думаю у вас нету желания в нём разбираться

Добавлено через 7 минут
рано радоваться, try охватывающий всю функции main не поймал std::length_error. Откуда он тогда может взяться ? Magic
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
05.09.2014, 18:35     Вылетает на std::length_error exception #6
Цитата Сообщение от OrmaJever Посмотреть сообщение
Откуда он тогда может взяться ?
Самое вероятное в такой ситуации - из инициализации глобальных объектов.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:49  [ТС]     Вылетает на std::length_error exception #7
да, есть один
C++
1
std::map< int, Room * >rooms;
обьявлен перед функцией main, как его продебажить?
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
05.09.2014, 19:04     Вылетает на std::length_error exception #8
OrmaJever, можешь показать чему равен первый параметр append? (gdb это умеет показывать)

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
обьявлен перед функцией main, как его продебажить?
В map нет никаких string
Больше глобальных объектов нет?

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
1413 строк чистого кода
Это очень мало. Кидай архивом. Быстрее поможем.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:13  [ТС]     Вылетает на std::length_error exception #9
ну код, дак код. Там и makefile есть, я им под линукс собираю.
Вложения
Тип файла: rar webchat.rar (2.88 Мб, 6 просмотров)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.09.2014, 19:26     Вылетает на std::length_error exception #10
OrmaJever,
Если на сокете не доступно ни одного сообщения, то обсуждаемые функции ожидают их прибытия, если сокет не помечен как неблокирующий (см. fcntl(2)), в противном случае возвращается значение -1, а внешняя переменная errno устанавливается в значение EAGAIN
So... Уверены что recv не вертает -1?
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:31  [ТС]     Вылетает на std::length_error exception #11
ForEveR, файл:строка пожалуйста
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
05.09.2014, 19:45     Вылетает на std::length_error exception #12
OrmaJever, не помню бывает ли такое в mysql api, но если бывает, то надо бы проверять не возвращается ли ноль, вместо строки. Например (client.cpp:172)
C++
1
2
3
4
    MYSQL_ROW row = mysql_fetch_row( res );
 
    if( Room::findUser( std::stoi( row[0] ) ) ) { // если row[0] == 0, то будет исключение при 
                                              // конструировании std::string (stoi принимает std::string)
И другие подобные места. Даже если ошибка не в этом, то все равно неплохо бы проверить этот момент.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.09.2014, 19:48     Вылетает на std::length_error exception #13
OrmaJever, В главной функции же.

C++
1
2
while( ( received = sock->recv( buf, 512 ) ) ) {
    RecvData.append( buf, received );
Юниксовский recv может вернуть -1. В итоге исключение.
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
05.09.2014, 19:58     Вылетает на std::length_error exception #14
ForEveR, OrmaJever, однозначно вертает. Тоже сейчас на это вышел. -1 кастится к unsigned int внутри append и срабатывает вот эта проверка:
C++
1
if (this->max_size() - (this->size() - __n1) < __n2)
где n1 == 0, а n2 == size_t(-1)
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 20:15  [ТС]     Вылетает на std::length_error exception #15
да, вставил перед
C++
1
RecvData.append( buf, received );
проверку
C++
1
2
3
    if( received == -1 ) {
    break;
}
и вроде проблема пропала. Но главный вопрос остался, почему gdb молчал?!
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
05.09.2014, 20:29     Вылетает на std::length_error exception #16
Цитата Сообщение от OrmaJever Посмотреть сообщение
Но главный вопрос остался, почему gdb молчал?!
Разве он молчал? Он честно показал стек. Выше функции append только main.

Не по теме:


Кстати, зачем ты наставил все возможные опции оптимизации в релизе? Ты знаешь, что они взаимоисключающие? (т.е. применяется все равно какая-то одна).

OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 20:57  [ТС]     Вылетает на std::length_error exception #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, зачем ты наставил все возможные опции оптимизации в релизе? Ты знаешь, что они взаимоисключающие? (т.е. применяется все равно какая-то одна).
Нет не знаю, думал все плюсуются. Чем отличаются, какая лучше?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2014, 21:11     Вылетает на std::length_error exception
Еще ссылки по теме:

C++ Не получается перехватить исключение, унаследованное от std::exception
Ошибка при работе с std::exception* C++
Создание своего класса исключений, наследование std::exception C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
05.09.2014, 21:11     Вылетает на std::length_error exception #18
Цитата Сообщение от OrmaJever Посмотреть сообщение
Чем отличаются, какая лучше?
Каждая из опций включает или отключает группу оптимизаций (их там много), вот мануал. Ставь -O2, в большинстве случаев этого достаточно.
Yandex
Объявления
05.09.2014, 21:11     Вылетает на std::length_error exception
Ответ Создать тему
Опции темы

Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru