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

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

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

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

05.09.2014, 17:49. Просмотров 653. Ответов 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++):

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

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

Грамотно обработать ошибку std::exception - C++
struct Node { Node(int data): data_(data) {} int data_; // полезная часть списка Node* next; // указатель на следующий...

Не получается перехватить исключение, унаследованное от std::exception - C++
#include <iostream> #include <stdexcept> #include <sstream> using namespace std; class BadInt : exception { ...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.09.2014, 18:05 #2
А при чём тут библиотека, если исключение происходит в самой программе?

Добавлено через 9 минут
Используя try/catch поймай исключение, выведи на экран номер строки __LINE__ и имя функции __FUNCTION__\__PRETTY_FUNCTION__.
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:05  [ТС] #3
castaway, я же и написал что библиотека тут не при чём, тогда почему я не получаю нормальных данных если программа собрана с флагом -g? Много других проблем и эксепшенов дебагер показывал нормально, а вот с этой беда.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.09.2014, 18:10 #4
Это тема про дебагер или про то как исправить ошибку?
Если про то как найти и исправить, тогда try/catch.
+ код тут точно не помешает.
OrmaJever
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
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
05.09.2014, 18:35 #6
Цитата Сообщение от OrmaJever Посмотреть сообщение
Откуда он тогда может взяться ?
Самое вероятное в такой ситуации - из инициализации глобальных объектов.
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 18:49  [ТС] #7
да, есть один
C++
1
std::map< int, Room * >rooms;
обьявлен перед функцией main, как его продебажить?
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
05.09.2014, 19:04 #8
OrmaJever, можешь показать чему равен первый параметр append? (gdb это умеет показывать)

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

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
1413 строк чистого кода
Это очень мало. Кидай архивом. Быстрее поможем.
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:13  [ТС] #9
ну код, дак код. Там и makefile есть, я им под линукс собираю.
Вложения
Тип файла: rar webchat.rar (2.88 Мб, 6 просмотров)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.09.2014, 19:26 #10
OrmaJever,
Если на сокете не доступно ни одного сообщения, то обсуждаемые функции ожидают их прибытия, если сокет не помечен как неблокирующий (см. fcntl(2)), в противном случае возвращается значение -1, а внешняя переменная errno устанавливается в значение EAGAIN
So... Уверены что recv не вертает -1?
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
05.09.2014, 19:31  [ТС] #11
ForEveR, файл:строка пожалуйста
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
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)
И другие подобные места. Даже если ошибка не в этом, то все равно неплохо бы проверить этот момент.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.09.2014, 19:48 #13
OrmaJever, В главной функции же.

C++
1
2
while( ( received = sock->recv( buf, 512 ) ) ) {
    RecvData.append( buf, received );
Юниксовский recv может вернуть -1. В итоге исключение.
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
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)
OrmaJever
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 молчал?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2014, 20:15
Привет! Вот еще темы с ответами:

Программа вылетает с ошибкой std::bad_alloc - C++
Всем привет! Задали написать программу, которая удаляет из файла все закомментированные строки(учитываются и //, и /* */) и реализовать в...

Ошибка при написании класса: Unhandled exception std::bad_alloc at memory location - C++
ПИшу свой клас Var, проблема в следующем из-за строчки first = first+1; вылетает ошибка Unhandled exception at at 0x760FB727 in...

Поймать exception, который вылетает при доступе к элементу пустого вектора - C++
Подскажите как правильно поймать exception, который вылетает при доступе к 1 элементу пустого вектора. #include &lt;iostream&gt; #include...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.09.2014, 20:15
Ответ Создать тему
Опции темы

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