Boost.Thread генерирует исключение bad_alloc в VS2010 - PullRequest
1 голос
/ 26 мая 2010

При включении <boost/thread.hpp> я получаю это исключение:

First-chance exception at 0x7c812afb in CSF.exe: Microsoft C++ exception: 
boost::exception_detail::clone_impl<boost::exception_detail::bad_alloc_> at memory location 0x0012fc3c..
First-chance exception at 0x7c812afb in CSF.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..

Я не могу его поймать, поломка в области памяти приводит меня к kernel32.dll, и на данный момент я не могу сказать, что происходитно похоже, что исключение выдается после завершения программы, и VS может его перехватить.

Тестовый случай:

#include <boost/thread.hpp>

int main()
{
   return 0;
}

Командная строка компилятора:
/I"I:\SophisPal\boost-1_43_0-vc10-32\include\boost-1_43" /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\Client.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

Командная строка компоновщика:
/OUT:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.exe" /INCREMENTAL:NO /NOLOGO "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_system-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_date_time-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_regex-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_thread-vc100-mt-1_43.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Release\Client.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE

Ответы [ 7 ]

2 голосов
/ 04 июня 2010

Это звучит как несоответствие между статическими библиотеками Boost и файлами заголовков. Как вы установили boost? Вы запустили bootstrap.bat на машине, чтобы собрать его? Вы модифицировали файлы заголовка boost после компиляции? Есть ли у вас ссылка на каталог библиотеки в глобальных настройках VS 2008 на каталог, содержащий другую версию библиотек наддува?

Другими словами, вы пробовали чистую установку boost с библиотеками, скомпилированными с bootstrap.bat, и удалили ли вы все другие реализации boost на вашем компьютере? Пока вы этого не сделаете, вы работаете на менее прочной основе.

Если после этого у вас все еще есть проблемы, пытались ли вы перейти к «Отладка-> Исключения» и включить разбивку исключений C ++ и Win32 первого шанса, чтобы вы могли видеть стек вызовов в отладчике? Если это не работает, вы пытались использовать Win32 API SetUnhandledExceptionFilter(), передавая обратный вызов, который использует MiniDumpWriteDump() API DBGHELP.DLL для записи мини-дамп (* .dmp) процесса в файл, который можно затем отладить с помощью отладчика VS 2010?

2 голосов
/ 09 ноября 2012

Я столкнулся с аналогичной проблемой с версией 4.6.1 g ++ - версия Boost 1.47.0

Ошибка очень расплывчатая, не указывает на какой-либо конкретный раздел кода. После долгих усилий прослежено добавление директивы pragma pack(1), но оно не закрыто до объявления шаблонов STL и / или повышения шаблонов элементов данных библиотеки.

Исправлено было удалить все pragma pack(x) и использовать упаковку в стиле GNU "__attribute__((packed))" для необходимых структур

Повышение должно лучше указывать ошибки / предупреждения при связывании с его библиотеками.

1 голос
/ 24 декабря 2010

У вас либо плохая сборка, либо испорчены настройки проекта, так как вы пытались создать новый базовый проект и просто включили заголовок, и я бы предложил перекомпилировать boost. Вы можете скачать последнюю версию 1.45 с sourceforge, которая связана с boost.org. Хватай последний бхам, пока ты там. Вы можете запустить следующие команды из командной строки Visual Studio для создания надстройки в 64-битной и 32-битной версиях:

bjam --build-type=complete --toolset=msvc-10.0 --stagedir=lib64 address-model=64 stage > x64-buildboost.log
RD bin.v2 /S /Q
bjam --build-type=complete --toolset=msvc-10.0 --stagedir=lib32 stage > x86-buildboost.log
RD bin.v2 /S /Q

С другой стороны, если ссылка на CSF относится к проекту телефонии Intel с открытым исходным кодом Communications Services Framework, над которым я работал ранее, и повышение производительности этого проекта в тот день сломало больше вещей, чем исправило ... честное предупреждение.

1 голос
/ 31 августа 2010

Это было разработано в boost 1.43, но с тех пор исправлено. Подробнее см. в этой теме .

1 голос
/ 03 июня 2010

Вы должны использовать профилировщик памяти, например VLD (Windows) или Valgrind (Linux), чтобы проверить, может ли он указывать на неправильное распределение, возможно, у вас есть версия библиотеки Boost, которая содержит ошибку несовместимости с вашим текущим компилятором, и вам, возможно, придется применить исправление.

1 голос
/ 01 июня 2010

Некоторые мысли:

Откуда вы знаете, что сбой происходит после main ()?

Что произойдет, если вы запустите из отладчика и настроите VS на перехват каждого исключения (а не только необработанного)?

Можете ли вы опубликовать трассировку стека?

1 голос
/ 30 мая 2010

Я рекомендую попытаться создать новое пустое консольное приложение Win32 (я обычно отмечаю флажок «Пустой проект», чтобы не получать предварительно скомпилированные заголовки и тому подобное для небольших проектов).

Добавьте файл .cpp в проект и укажите его содержимое.

В свойствах проекта, под C / C ++ -> General , в поле Additional Include Directoryies добавьте путь к вашей папке Boost верхнего уровня (той, которая содержит папка с именем boost , в которой находятся все файлы заголовков). В моем случае это z: \ dev \ boost_1_43_0 ; исходя из вашего поста, вы, вероятно, I: \ SophisPal \ boost-1_43_0-vc10-32 \ include \ boost-1_43 .

Также в свойствах проекта в разделе Linker -> General , в поле Дополнительные библиотеки , добавьте путь к папке, содержащей скомпилированные библиотеки Boost. На моем ПК это z: \ dev \ boost_1_43_0 \ lib ; основываясь на вашем посте, вы, вероятно, I: \ SophisPal \ boost-1_43_0-vc10-32 \ lib .

Вам не нужно явно указывать компоновщику, с какими библиотеками вы хотите ссылаться; заголовки Boost используют одну из директив Visual C ++ #pragma, чтобы указать компоновщику, какие библиотеки необходимо использовать.

Только благодаря этому вы сможете создавать и запускать конфигурации Debug и Release. Я прошел именно эти шаги, и у меня не было проблем.

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

Если это не не работает, я бы посмотрел на загрузку источника Boost и его сборку заново.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...