Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wincore.cpp 
:(
    Опции темы
mrgloom
Дата 9.9.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в режиме дебага когда идет запись в вектор
на функции 

SomeFuncPushTovec();

вылетает на 
Цитата

    CATCH_ALL(e)
    {
  lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
  TRACE(traceAppMsg, 0, "Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
  DELETE_EXCEPTION(e);
    }


по стэку вызовов понять ничего не удалось.

предполагаю, что что то связанное с ограничением на память (в е CMemoryException).

почему это происходит?
PM MAIL   Вверх
Earnest
Дата 9.9.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Стек вызовов в момент отлова исключения рассматривать бесполезно. Нужно ловить исключение в момент генерации.
Во первых, нужно понять какой тип исключения. Это можно увидеть (в дебаге) в Output-окне. Там должно быть написано что-то вроде First chance exception at... Далее нужно в окне Debug-Exceptions включить перехват нужных типов исключений; можно сразу группу, а не поштучно. 
Если тип исключения понять не получается, попробуй C++ exceptions и Run-time (не помню. точно как называются - там где Access violation и т.д.)
Вот в момент генерации исключения смотри стек. 
Иногда бывает, что ты ловишь не первичное исключение, а "переизлученное". Тогда нужно еще поработать с окном перехвата исключений... и внимательно смотреть Output (найти самое первое исключение)



--------------------
...
PM   Вверх
mrgloom
Дата 12.9.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



во время дебага нажал Ctrl + Alt +E
и поставил галочку напротив С++ Exeptions->CExeption
ну и дебагер остановился на том же месте CATCH_ALL(e)
тип исключения CMemoryExeption
в логе дебаг окна  Microsoft C++ exception: CMemoryException at memory location
я так и не понял как посмотреть из какого куска кода оно пришло.
PM MAIL   Вверх
Earnest
Дата 12.9.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Возможно, что-то сделано неправильно. Но бывает, и что не срабатывает.
Тогда попробуй отловить момент создания исключения CMemoryException - поставь точку прерывания в MFC-коде.


--------------------
...
PM   Вверх
mrgloom
Дата 12.9.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



надо было перед дебагом.

вообщем.
First-chance exception CMemoryException at memory location
bgheap.c
на строчке
/* do the allocation
             */
pvBlk = _heap_alloc_dbg_impl(nSize, nBlockUse, szFileName, nLine, errno_tmp);


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

хотя пробовал запускать откомпилированный экзешник на машине с 4Гб всю память не занимает, а вываливается примерно на 2Гб.

Это сообщение отредактировал(а) mrgloom - 12.9.2011, 16:27
PM MAIL   Вверх
Earnest
Дата 12.9.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mrgloom @  12.9.2011,  17:26 Найти цитируемый пост)
похоже просто не может выделить память в вектор 

Похоже???
Если ты реально ждал, что тебе 2 гб в хипе выделят, тебе срочно нужен ликбез - надо книжку какую-никакую прочесть, про виндоус, про память и т.д., Рихтера, например.  smile 



--------------------
...
PM   Вверх
mrgloom
Дата 13.9.2011, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну я так подозреваю что 2гб это предел для приложения в х32 системе? (хотя вроде тяжелые приложения как то расширяют это дело до 3Гб).

попробую под х64.

и еще как то можно оценивать полный объем памяти, который использует программа, чтобы она не падала на х32?



Upd: на х64 та же история (2GB per process) или я чего то делаю не то.
хотя на х64 всего 2Гб памяти так что может быть и в этом проблема.


Это сообщение отредактировал(а) mrgloom - 13.9.2011, 11:28
PM MAIL   Вверх
mrgloom
Дата 13.9.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пробовал этот метод скомпилировать с флагом /LARGEADDRESSAWARE
http://msdn.microsoft.com/en-us/library/wz223b1z

эффект тот же, хотя возможно из-за того, что х64 имеет 2Гб, но по идее есть еще и файл подкачки.
PM MAIL   Вверх
Earnest
Дата 13.9.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



На 32-битной платформе процессу выделяется 4 гб виртуального адресного пространства. Больше не позволяет адресация. В это же адресное пространство отображаются все необходимые системные библиотеки, а также сам процесс. Сколько памяти есть физически в системе - не важно, это будет влиять только на скорость (разве что на диске не хватит места под своп или своп вообще отключен). Под хип остается то, что не занято стеком и прочими запросами на память. Причем хип может фрагментироваться. Так что рассчитывать на большой кусок не стоит.
Под 64-битной платформой памяти процессу должно выделяться по идее больше. Почему у тебя не получилось, не знаю. Разве что ты не компилировал под 64, а просто запустил 32-битное приложение.


--------------------
...
PM   Вверх
mrgloom
Дата 13.9.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет я скомпилировал под х64(статическая линковка на выходе только 1 экзешник, флаг /LARGEADDRESSAWARE проставил насильно) (на системе х32 специально проверил экзешник не запустился) перенес на систему х64 и запустил там(только там 2Гб памяти) и начал смотреть что там происходит через vmmap примерно когда heap  занимал 1.8Гб , а полный размер ~2Гб  все начало свопиться и начались дикие тормоза, а потом все равно приложение вроде бы упало.

может нельзя выделять больше 2Гб непрерывной памяти? или на это нет ограничений?
PM MAIL   Вверх
Earnest
Дата 14.9.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mrgloom @  13.9.2011,  18:34 Найти цитируемый пост)
может нельзя выделять больше 2Гб непрерывной памяти? или на это нет ограничений?

Не могу сказать. Пока с 64-битными приложениями не связывалась... Теоретически вроде не должно быть такого ограничения, но хз


--------------------
...
PM   Вверх
mrgloom
Дата 14.9.2011, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



запустил на машине х64 с 4 гб, программа отъела 4Гб и сообщила, что ей не хватает памяти.

вообщем все работает, но почему то файл подкачки она кушать не хочет.  причем программа не падает, но и память не сбрасывает.
т.е. она кушает много памяти на ф-ии
add_many_items_to_vector()  
потом вылетает эксепшн на память и как дальше она себя ведёт\должна вести не очень понятно.

Добавлено через 4 минуты и 15 секунд
может возможно контролировать как то поведение программы на таких участках? или как то все время проверять с какой то периодичностью.
что то типа
Код

MEMORYSTATUSEX statex;//
statex.dwLength = sizeof (statex);//
GlobalMemoryStatusEx (&statex);//
if (statex.ullAvailVirtual)

PM MAIL   Вверх
Earnest
Дата 14.9.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Может, проще не жрать столько памяти? smile 
Я за свою довольно долгую карьеру ни разу с таким проблемами не сталкивалась... 
Нельзя же программировать на абстрактной машине Тьюринга. 


--------------------
...
PM   Вверх
mrgloom
Дата 14.9.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



заранее рассчитывалось, что приложение может есть много памяти.

аппетиты конечно сократятся, но хотелось бы уметь и обрабатывать такие ситуации нехватки памяти.
PM MAIL   Вверх
mrgloom
Дата 14.9.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

скажем такое 
while(1)
{
     vec.push_back(item);
}


почитал тут http://users.msu.dubna.ru/~nefedov/c++course/p2-3.html
но там про new[],но я то работаю со стандартным вектором.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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