Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странный вылет программы 
:(
    Опции темы
stmamont
Дата 10.1.2007, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Возможно глупый вопрос, но ума не приложу куда смотреть!

Программа выполняет долгую работу, (несколько суток).
И вот на 5 часу работы она странно завершила работу.
т.е. не выдала никакой ошибки , ничего, просто завершилась.
Приложение многооконное, программа выключается при закрытии всех окон.
Я с ней ничего не делал.
за памятью следил (в списке процессов смотрел сколько памяти ест, на момент закрытия было порядка 20 Мб).
Компьютер мощный.
ПО-моему, ошибка во всяком случае должна была выскочить.
Не подскажете что могло произойти?


--------------------
user posted image
PM MAIL ICQ   Вверх
dumb
Дата 10.1.2007, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



посмотри в EventLog. в серверных виндах галка "уведомлять о сбоях" снята по умолчанию, так что падающее приложение только пишет в лог "ватсона" и в EventLog.

если нет, то вставляй подробный логгинг, отлаживайся.
PM MAIL   Вверх
stmamont
Дата 10.1.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



то есть такое возможно? что бы программа закрылась без ошибок? хотя в ней кода даже такого нету. (чтобы закрывалась?)


--------------------
user posted image
PM MAIL ICQ   Вверх
Bima
Дата 10.1.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



В винде свойство такое есть, закрывать зависшие процессы. А насчет твоей программы, здесь не телепаты, что бы судить, правильно у тебя написано программа или нет, может она 5 часов работает, а потом вызывает какую нибудь инструкцию, которая неправильно выделяет память и все - кирдык, винда такого не простит smile.
Что бы знать где программа выскочила, делай логи, то есть после определенных функций или команд пиши время и действие в файл, а потом просматривай логи.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
stmamont
Дата 11.1.2007, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



>>может она 5 часов работает, а потом вызывает какую нибудь инструкцию, которая неправильно выделяет память и все - кирдык, винда такого не простит

Очень похоже на это.
работает около 3 часов, перелопатила 5000 элементов.
После чего Access Violation at address 0000000032 . Т.е. я похоже пытался создать объект при помощи new но винда память не выделила, и я без проверки полез к какоу то элементу.

Почему такое может произойти?
На момент ошибки программа весит в оперативке 20Мб. Что вполне адекватно информации которую она хранит, т.е. утечек памяти быть не должно. (В пред версии была утечка, программа вылетела при размере 300Мб))))

Почему система может не выделить память? и занулит ли  она указатель , если не смогла выделить память?


--------------------
user posted image
PM MAIL ICQ   Вверх
dumb
Дата 11.1.2007, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(stmamont @  11.1.2007,  02:01 Найти цитируемый пост)
и занулит ли  она указатель , если не смогла выделить память?

единственный вопрос, на который можно ответить. занулит.

Цитата(stmamont @  11.1.2007,  02:01 Найти цитируемый пост)
После чего Access Violation at address 0000000032

чаще всего такое бывает при вызове метода несуществующего объекта.

может помочь - madExcept
PM MAIL   Вверх
Bima
Дата 11.1.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Опять те же грабли.
МЫ здесь не телепаты, что бы обсуждать гипотетический код на предмет ошибки.
Цитата

Т.е. я похоже пытался создать объект при помощи new но винда память не выделила, и я без проверки полез к какоу то элементу

если ты в цикле постоянно создаешь элементы и их удаляешь, то это не есть ГУД. Попробуй их создать при создании формы, а удалять в конце программы. Конечно я предвижу вопрос, что всякое может понадобиться в момент исполнения программы, и программа должна все выполнить, но  создание элементов  с помощью new не дает гарантии, что он создался ( если быть точне я не помню, как проверить создание данного элемента), в отличии от "сишного"  оператора выделения памяти (типа allocmem) у которого можно проверить выделилась память или нет. Для примера код:
Код

unsigned int memory(unsigned int Size)  // Функция выделения памяти
    {
          int                   stat;     // Флаг успушного выделения памяти
          unsigned long          max;     // Переменная мах данных по ПДП
          unsigned long           Ch=1;         // Счетчик параграфов памяти
          unsigned int          temp;     // Временный буфер для массива
          stat=allocmem(Size,&adres_buf); // Выделение памяти
          if (stat!=-1)                   // Проверка выделения памяти
                {
                printf ("Out of memory\n");
                exit(0);
                }
          addr = ((unsigned long)adres_buf << 4); // Вычисление линейного адреса
          max = 0xffff+0x1 - ((addr>>1) & 0xffff);// Вычесляем и проверяем сколько
          if (max>512)                         // данных может передать ПДП в пре-
                {                                // делах одной страницы памяти
                return 0;  // Если до конца страницы больше 512 слов то выходим
                }
          else           // иначе выделяем временный участок памяти, размером рав-
                {          // ным на один параграф больше чем предыдущее выделение
                Ch=1;      // памяти и после этого выделяем нужный участок памяти
                met1:
                freemem(adres_buf);
                printf("\a");
                stat=allocmem((int)max/16,&temp);
                if (stat!=-1)
                    {
                    printf ("Out of memory\n");
                    exit(0);
                    }
                stat=allocmem(Size,&adres_buf);
                if (stat!=-1)
                    {
                    printf ("Out of memory\n");
                    exit(0);
                    }
                addr = ((unsigned long)adres_buf << 4);
                max = 0xffff+0x1 - ((addr>>1) & 0xffff);
                if (max>512)
                    {
                    freemem(temp);
                    return 0;
                    }
                Ch++;              // если выделение памяти не прошло успешно
                max=max+Ch;        // то инкремируем счетчик параграфов и повторяем
                freemem(temp);     // процедуру выделения памяти снова
                goto met1;
                }
     }

Я взял подпрограмму для выделения памяти, которую писал лет 5 назад. Сам алгоритм не важен, а важно, как идет выделение памяти и проверка выделения памяти. Анологично должно быть и в твоей программе.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Anikmar
Дата 11.1.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Bima @  11.1.2007,  06:56 Найти цитируемый пост)
но  создание элементов  с помощью new не дает гарантии, что он создался ( если быть точне я не помню, как проверить создание данного элемента), в отличии от "сишного"  оператора выделения памяти (типа allocmem) у которого можно проверить выделилась память или нет.


Почему нельзя проверить? 

Вот что пишет тот же HELP Buildera:
Цитата

The new operators offer dynamic storage allocation, similar but superior to the standard library function malloc. These allocation functions attempt to allocate size bytes of storage. If successful, new returns a pointer to the allocated memory. If the allocation fails, the new operator will call the new_handler function. The default behavior of new_handler is to throw an exception of type bad_alloc. If you do not want an exception to be thrown, use the nothrow version of operator new.  The nothrow versions return a null pointer result on failure, instead of throwing an exception.


По умолчанию, при ошибки выделении памяти new вылетает исключение
Если использовать форму new(nothrow) - то исключения не будет, а при ошибке вернет NULL

Кстати: я точно не проверял, но по-моему Builder по умолчанию делает как раз nothrow - т.е. без исключения, но я точно не помню.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 11.1.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Anikmar @  11.1.2007,  11:23 Найти цитируемый пост)
Кстати: я точно не проверял, но по-моему Builder по умолчанию делает как раз nothrow - т.е. без исключения, но я точно не помню. 

Bulder придерживается стандарта и соответсвенно форма new при ошибке выделения памяти генерит исключение. Ладно я,  еще успел поработать на компиляторах "достандартной" эпохи, но сейчас то ....  Тем не менее на собеседовании при приеме на работу 50 процетов кандидатов не видят в ниже следующем коде ничего криминального
Код

char* pchar = new char[size];
if (!pchar) {
//ERROR
}
 
Более того. Когда явно указываешь им на бессмысленность проверки, уверяют что ВСЕ И ВСЕГДА  ТАК ДЕЛАЮТ.

Добавлено @ 11:47 
Цитата(stmamont @  11.1.2007,  02:01 Найти цитируемый пост)
Т.е. я похоже пытался создать объект при помощи new но винда память не выделила, и я без проверки полез к какоу то элементу.

Этого не может быть, потому что быть не может. Если конечно Вы не промаскировали возникшее при этом исключение. Скорее всего, Вы обратили к объекту, который уже уничтожили или еще не создали


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
stmamont
Дата 11.1.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



Ясно, спасибо. Теперь буду отлавливать все выделения памяти и обращения к нулевым указателямю


--------------------
user posted image
PM MAIL ICQ   Вверх
Bima
Дата 11.1.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Vyacheslav поясни свой код:
Код

char* pchar = new char[size];
if (!pchar) {
//ERROR
}

Насколько я понимаю, здесь выделяется массив размерностью size и указатель pchar указывает на этот массив. Всегда не в ладах был с этими указателями, поэтому хочу поточнее уловить этот момент. Я не знаю, что возвращает в данном случае операция new char[size], но по логике эта операция может вернуть адрес на первый элемент массива и он не будет равен 0. Или я не прав???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
stmamont
Дата 11.1.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



смысл такой: оператор new выкидывает exception если система не смогла выделить память. И соответственно до второй строчки работа программы не дойдет.
А в если все пройдет нормально, то оператор new вернет указатель на первый элемент массива char размера size и проверка тем более не нужна.


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 11.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Bima @  11.1.2007,  13:48 Найти цитируемый пост)
Vyacheslav поясни свой код:


stmamont прекрасно все разъяснил без меня smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Bima
Дата 11.1.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



теперь понял, спасибо


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Sfairet
Дата 11.1.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 11.1.2007

Репутация: нет
Всего: нет



По моему вариант с нулём не такой уж и безнадежный, во первых старые версии new возвращают именно 0 (до принятия стандарта), к томуже не каждый компилятор согласиться генерировать исключение bad_alloc, а также просто будет использовать вариант с 0
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.