Зря вы закрыли тему, т.к. проблема нестабильной работы с рандомными падениями так и не была решена, к тому же, мы столкнулись с вновь открывшимися чудесами (о них позже), и более того: Ура!!! Мы научились железобетонно воспроизводить проблему и теперь можно наконец то отладиться и пофиксить багу. Итак, если перед LoadLibrary gisu64vcacces.dll выделить жирный кусок памяти > 2 Гигабайт, начнутся чудеса (см приложенный load_library_crash_with_2Gb.png)
Следуя вашим рекомендациям из http://www.gisweb.ru/forum/forum2/topic9163/messages/?PAGEN_1=8 , решил слинковаться с GTK через *.lib файлы, но от этого не полегчало, чудес прибавилось.Если перед вызовом mapOpenMap выделить 2 гигабайта памяти получим access violation reading location c весьма странным callstack где то внутри shape.iml64 (см приложенный lib_files_crash_with_2Gb.png)
Но самое интересное впереди. Если мы выделим 4 гигабайта, мы получим не reading, а тот самый writting location! И если мы нажмем кнопочку Continue в окошке студии, мы получим интересный message box от GTK - не могу найти shape.iml64 (см приложенный lib_files_crash_with_4Gb.png)
Что-то у вас с менеджером памяти, коллеги + еще возможно что-то в GTK перетирает еще и чужую память. Помните тут http://www.gisweb.ru/forum/forum2/topic9163/messages/ я вам писал, что при использовании GTK у нас были случаи, когда кто-то перетирал наши данные? У нас каким то чудным образом оказывались пустые std::string, которые заполнялись до загрузки GTK. Прошу Вас скорейшим образом решить данную проблему. Пошел уже 8ой месяц как мы мучаемся с данной проблемой - постоянно придумываем костыли, чтобы ПО хоть как то работало, и у нас уже горят все сроки! Тестовый проект можно скачать тут: https://cloud.mail.ru/public/4ZRD/NudxXffob
В ГИС-ядре (компилируется в Embarcadero) для выделения памяти используется только new и delete. По идее они работают с теми же системными функциями, что и в VS. Первая ситуация говорит о том, что когда попросили 2 ГБ, то ntdll не смогла загрузить библиотеку. На практике сталкивались с ситуацией похожей, когда попытка запросить память больше чем физически есть приводит к непредсказуемому поведению программы. При выделении памяти надо контролировать, что ее система выделила (проверять что вернула new).
Andrey Gheleznyakov написал: В ГИС-ядре (компилируется в Embarcadero) для выделения памяти используется только new и delete. По идее они работают с теми же системными функциями, что и в VS. Первая ситуация говорит о том, что когда попросили 2 ГБ, то ntdll не смогла загрузить библиотеку. На практике сталкивались с ситуацией похожей, когда попытка запросить память больше чем физически есть приводит к непредсказуемому поведению программы. При выделении памяти надо контролировать, что ее система выделила (проверять что вернула new).
Я извиняюсь, но вы что надо мной издеваетесь?!!! То что вы пишете не выдерживает ни какой критики! Я вам выслал пример, который можно собрать и запустить у себя, вы видимо этого даже не делали! Сколько уже можно морочить мне голову? Я уже устал читать тут отписки ваших сотрудников!!!! Видимо мне пора звонить в вашу компанию и просить разговор с вашим начальством!
1) new уже очень давно кидает исключение std::bad_alloc если у нее не получилось выделить память. Ознакомьтесь: http://en.cppreference.com/w/cpp/memory/new/bad_alloc 2) Проблема проявляется на разных машинах, с разной конфигурацией железа 3) На моей машине установлено 32 Гигабайта ОЗУ и при запуске тестов свободно 19 Гигабайт (см скриншоты ниже)
Давайте разбираться в проблеме и вникать в нее! С вашими библиотеками невозможно работать! Найдите и исправьте проблему, запустите мой тестовый пример наконец-то и все увидите своими глазами. На последок, стану уже в 100500ый раз вашим тестером, посмотрите скриншоты ниже:
Александр Волков написал: Хотелось бы получить обратную связь. Будет ли анализироваться данная проблема?
Вопрос рассматривается, ответ будет дан немного позже.
Спасибо.
Добрый день! Скажите, пожалуйста, сколько нам еще ждать? Прошло уже больше 2-х недель, но до сих пор нет ни какого решения. Нас крайне поджимают сроки, мы не можем столько ждать.
Тестирование библиотеки gisu64vcacces.dll пока не завершено.
Тестирование библиотеки gisu64vcacces.dll выполняется с применением: -консольного приложения TestConsole_2008_2GB.exe (VC 2008) c выделением 2 ГБ памяти, -консольного приложения TestConsole_2008_0GB.exe (VC 2008) без выделения памяти, -MFC-приложения MapViewer.exe.
В ходе выполнения тестов в исходные тексты библиотеки gisu64vcacces.dll внесены следующие изменения:
1. Добавлен контроль выполнения метода GdiplusStartup при инициализации GDI+. 2. Выделение и освобождение памяти вынесено из библиотеки gisu64vcacces.dll и соответственно Embarcadero. Собрана VC-библиотека gisu64vcmemory.dll для выделения и освобождение памяти. Исходные тесты VC-библиотеку gisu64vcmemory.dll в папке \Source\ архива 06_27_Test.zip. VC-библиотека gisu64vcmemory.dll содержит 2 функции:
Код
// Выделение/Освобождение памяти в библиотеках GisToll Kit
__declspec(dllexport) char * __stdcall AllocateVc(unsigned int size);
__declspec(dllexport) void __stdcall FreeVc(char * memory);
В библиотеку gisu64vcacces.dll добавлены функции:
Код
// Функция загружает библиотеку gisu64vcmemory.dll
// Запрашивает адреса функций AllocateVc, FreeVc
_MAPIMP int _MAPAPI mapInitAllocateVcManager();
// Функция выгружает библиотеку gisu64vcmemory.dll
_MAPIMP int _MAPAPI mapCloseAllocateVcManager();
Промежуточные результаты тестов опубликованы в таблице \Таблица\Таблица.xlsx архива 06_27_Test.zip. Содержимое архива 06_27_Test.zip: \Data\ - тестовые данные, \DLL_ТЕСТ\ - библиотеки и исполняемые модули, \Source\ - исходные тексты тестовых модулей и библиотеки выделения/освобождения памяти, \Таблица\ - таблица фиксации тестов.