Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
1

Вылетает на std::length_error exception

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

Author24 — интернет-сервис помощи студентам
название не очень отражает суть вопроса, но лучше я предумать не смог.
Есть программа собранная в дебаге (-g) к ней линкуется только одна библиотека libmysql.lib которая написана на Си и не знает что такое std::string, и вот эта программа время от времени вылетает на std::lenth_error exception который кидает string::append, но дебагер не может дать подробной информации почему и где это происходит (скрины ниже).
Вопрос №1: почему программа собранная в дебаге не может дать нормальной информации про call stack?
№2: что делать в таких случаях, как искать ошибку?
Миниатюры
Вылетает на std::length_error exception   Вылетает на std::length_error exception  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2014, 17:49
Ответы с готовыми решениями:

Unhandled exception at at 0x75E717D2 in ConsoleApplication24.exe: Microsoft C++ exception: std::out_of_range at memory l
Здравствуйте, помогите пожалуйста, при проходе через последний цикл выдаёт вот такую ошибку:...

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку? Вот #include...

Грамотно обработать ошибку std::exception
struct Node { Node(int data): data_(data) {} int data_; // полезная часть списка ...

Ошибка при работе с std::exception*
Почему в случаях 1 и 3 выводится нормальный e.what(), а во втором - ошибочный? Как это исправить? ...

17
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
05.09.2014, 18:05 2
А при чём тут библиотека, если исключение происходит в самой программе?

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

Добавлено через 7 минут
рано радоваться, try охватывающий всю функции main не поймал std::length_error. Откуда он тогда может взяться ? Magic
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
05.09.2014, 18:35 6
Цитата Сообщение от OrmaJever Посмотреть сообщение
Откуда он тогда может взяться ?
Самое вероятное в такой ситуации - из инициализации глобальных объектов.
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:49  [ТС] 7
да, есть один
C++
1
std::map< int, Room * >rooms;
обьявлен перед функцией main, как его продебажить?
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
05.09.2014, 19:04 8
OrmaJever, можешь показать чему равен первый параметр append? (gdb это умеет показывать)

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

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
1413 строк чистого кода
Это очень мало. Кидай архивом. Быстрее поможем.
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:13  [ТС] 9
ну код, дак код. Там и makefile есть, я им под линукс собираю.
Вложения
Тип файла: rar webchat.rar (2.88 Мб, 10 просмотров)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.09.2014, 19:26 10
OrmaJever,
Если на сокете не доступно ни одного сообщения, то обсуждаемые функции ожидают их прибытия, если сокет не помечен как неблокирующий (см. fcntl(2)), в противном случае возвращается значение -1, а внешняя переменная errno устанавливается в значение EAGAIN
So... Уверены что recv не вертает -1?
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:31  [ТС] 11
ForEveR, файл:строка пожалуйста
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
05.09.2014, 19:45 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)
И другие подобные места. Даже если ошибка не в этом, то все равно неплохо бы проверить этот момент.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.09.2014, 19:48 13
OrmaJever, В главной функции же.

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

Не по теме:


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

1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 20:57  [ТС] 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, зачем ты наставил все возможные опции оптимизации в релизе? Ты знаешь, что они взаимоисключающие? (т.е. применяется все равно какая-то одна).
Нет не знаю, думал все плюсуются. Чем отличаются, какая лучше?
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
05.09.2014, 21:11 18
Цитата Сообщение от OrmaJever Посмотреть сообщение
Чем отличаются, какая лучше?
Каждая из опций включает или отключает группу оптимизаций (их там много), вот мануал. Ставь -O2, в большинстве случаев этого достаточно.
1
05.09.2014, 21:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2014, 21:11
Помогаю со студенческими работами здесь

Не получается перехватить исключение, унаследованное от std::exception
#include &lt;iostream&gt; #include &lt;stdexcept&gt; #include &lt;sstream&gt; using namespace std; class...

Создание своего класса исключений, наследование std::exception
хотел создать свой класс исключений пронаследовав от std::exception, но немного запутался в...

mingw32, SEH, std::exception, setjmp/longjmp, signal
Начал разбираться с вопросом - как понял - есть несколько вариантов: (в порядке обнаружения мною) ...

Unhandled exception.std::out_of_range at memory location. ошибка
Доброго времени суток! Задача такая: Если с четырёхцифрового убрать любую цифру, получим...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru