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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

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

05.09.2014, 17:49. Просмотров 587. Ответов 17
Метки нет (Все метки)

название не очень отражает суть вопроса, но лучше я предумать не смог.
Есть программа собранная в дебаге (-g) к ней линкуется только одна библиотека libmysql.lib которая написана на Си и не знает что такое std::string, и вот эта программа время от времени вылетает на std::lenth_error exception который кидает string::append, но дебагер не может дать подробной информации почему и где это происходит (скрины ниже).
Вопрос №1: почему программа собранная в дебаге не может дать нормальной информации про call stack?
№2: что делать в таких случаях, как искать ошибку?
Миниатюры
Вылетает на std::length_error exception   Вылетает на std::length_error exception  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 17:49     Вылетает на std::length_error exception
Посмотрите здесь:

C++ зачем часто писать std:: если можно один раз using namespace std?
mingw32, SEH, std::exception, setjmp/longjmp, signal C++
Как искать по std::vecotr из std::pait по одному значению из пары? C++
C++ Грамотно обработать ошибку std::exception
Поймать exception, который вылетает при доступе к элементу пустого вектора C++
Ошибка при написании класса: Unhandled exception std::bad_alloc at memory location C++
First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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++
Программа вылетает с ошибкой std::bad_alloc C++
C++ Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"

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

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

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