Приложение Visual C ++ аварийно завершает работу перед выпуском main в Release, но в Debug работает нормально - PullRequest
1 голос
/ 02 декабря 2008

При выпуске происходит сбой с необработанным исключением: ошибка std :: length.

Стек вызовов выглядит так:

msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!__set_flsgetvalue()  Line 256 + 0xc bytes   C
msvcr90.dll!_getptd_noexit()  Line 616 + 0x7 bytes  C
msvcr90.dll!_getptd()  Line 641 + 0x5 bytes C
msvcr90.dll!rand()  Line 68 C
NEM.exe!CGAL::Random::Random()  + 0x34 bytes    C++
msvcr90.dll!_initterm(void (void)* * pfbegin=0x00000003, void (void)* * pfend=0x00345560)  Line 903 C
NEM.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes  C
kernel32.dll!7c817067()     

У кого-нибудь есть какие-нибудь подсказки?

Ответы [ 4 ]

3 голосов
/ 02 декабря 2008

Изучение дампа стека:

InitTerm - это просто функция, которая просматривает список других функций и выполняет каждую в шаге - она ​​используется, среди прочего, для глобальных конструкторов (при запуске), глобальных деструкторов (при выключении) и списков atexit (также при выключении) ).

Вы связываетесь с CGAL, поскольку значение CGAL::Random::Random в дампе стека связано с тем, что CGAL определяет глобальную переменную с именем default_random типа CGAL::Random::Random. Вот почему ваша ошибка происходит до main, default_random создается.

Из источника CGAL все, что он делает, называется стандартным C srand(time(NULL)), за которым следует локальный get_int, который, в свою очередь, вызывает стандартный C rand(), чтобы получить случайное число.

Однако вы не переходите ко второму этапу, поскольку дамп стека все еще находится в пределах srand().

Это выглядит , как будто он лениво преобразует ваш поток в волокно, т. Е. Это первый раз, когда вы пытаетесь что-то сделать в потоке, и ему нужно настроить локальное хранилище, прежде чем продолжить .

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

1 / Вы используете этот код на pre-XP? Я считаю, что локальное хранилище данных (__set_flsgetvalue) было введено в XP. Это длинный выстрел, но мы все равно должны его очистить.

2 / Вам нужно связаться с CGAL? Я предполагаю, что вашему приложению нужно что-то в библиотеках CGAL, иначе не связывайтесь с этим. Это может быть похмелье из другого файла проекта.

3 / Если вы действительно используете CGAL, убедитесь, что вы используете последнюю версию. Начиная с версии 3.3 он поддерживает динамическое связывание, которое должно исключать возможность смешивания разных версий библиотеки (как статической / динамической, так и отладочной / не отладочной).

4 / Вы можете попробовать скомпилировать с VC8? Платформы, поддерживаемые CGAL, НЕ , но включают VC9 (VS2008). Возможно, вам придется проконсультироваться с самой командой CGAL, чтобы узнать, работают ли они над этой поддержкой.

5 / И, наконец, у вас установлен Boost? Это еще один длинный выстрел, но все равно стоит посмотреть.

Если ни одно из этих предложений не поможет, вам придется подождать, пока кто-нибудь более осведомленный, чем я, не боится.

Удачи.

0 голосов
/ 22 декабря 2008

Не могли бы вы более подробно рассказать об ошибке, которую получаете? (необработанное исключение std :: length звучит странно - я никогда не слышал об этом)

Насколько мне известно, FlsGetValue автоматически возвращается к аналогу TLS, если API-интерфейс FLS недоступен.

Если вы все еще застряли, возьмите .dmp вашего процесса во время сбоя и опубликуйте его (используйте любой из многочисленных бесплатных сервисов загрузки - и дайте нам ссылку) (Похоже, отсутствует функция в SO - source / обмен файлами данных?)

0 голосов
/ 02 декабря 2008

У вас есть глобальная или статическая переменная типа Random? Возможно ли, что вы пытаетесь создать его до того, как библиотека, в которой он находится, была правильно инициализирована?

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

0 голосов
/ 02 декабря 2008

Сбои перед main () обычно вызваны неправильным конструктором в глобальной или статической переменной.

Выглядит как конструктор для класса Random .

...