1

包括在内后,<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

4

7 回答 7

2

这听起来像是 Boost 静态库和头文件之间的不匹配。你是如何安装boost的?您是否在机器上运行 bootstrap.bat 来构建它?编译后是否修改了boost头文件?您在 VS 2008 全局设置中是否有库目录引用到包含不同版本的 boost 库的目录?

换句话说,您是否尝试过使用 bootstrap.bat 编译的库来全新安装 boost,并且您是否删除了计算机上的所有其他 boost 实现?在你做到这一点之前,你的工作基础并不牢固。

如果在那之后仍然遇到问题,您是否尝试过 Debug->Exceptions 并打开第一次机会 C++ 和 Win32 异常的中断,以便您可以在调试器中看到调用堆栈?如果这不起作用,您是否尝试过使用 Win32 APISetUnhandledExceptionFilter()传递一个回调,该回调使用MiniDumpWriteDump()APIDBGHELP.DLL将进程的迷你转储 (*.dmp) 写入一个文件,然后您可以进行事后调试使用 VS 2010 调试器?

于 2010-06-04T17:44:55.073 回答
2

我在 g++ 的 4.6.1 版中遇到了类似的问题 - boost 1.47.0 版

该错误非常模糊,没有指向任何特定的代码部分。经过大量努力,它被追溯到添加pragma pack(1)指令,但在声明 STL 模板和/或提升库数据成员模板之前并未关闭。

修复是删除所有pragma pack(x)并使用 GNU 样式打包"__attribute__((packed))"所需的结构

Boost 在与其库链接时应该更好地指出错误/警告。

于 2012-11-08T23:59:46.717 回答
1

一些想法:

你怎么知道在main()之后发生了崩溃?

如果您从调试器运行并将 VS 配置为捕获每个异常(不仅仅是未处理的),会发生什么?

您可以发布崩溃的堆栈跟踪吗?

于 2010-06-01T18:28:04.607 回答
1

您应该使用VLD (Windows) 或 Valgrind (Linux) 之类的内存分析器来检查它是否可以指向错误分配,也许您的 Boost 库版本包含与当前编译器不兼容的错误,您可能必须应用修复。

于 2010-06-03T08:21:43.620 回答
1

我建议尝试创建一个新的、空的 Win32 控制台应用程序(我通常选中“空项目”复选框,以免获得预编译的头文件等用于小型项目)。

.cpp文件添加到项目并为其提供您的内容。

在项目属性中,在C/C++ -> General下,在Additional Include Directories框中,添加顶级 Boost 文件夹的路径(该文件夹包含名为boost的文件夹,其中包含所有头文件)。就我而言,它是z:\dev\boost_1_43_0;根据您的帖子,您的可能是I:\SophisPal\boost-1_43_0-vc10-32\include\boost-1_43

同样在项目属性中,在Linker -> General下,在Additional Library Directories框中,添加包含已编译 Boost 库的文件夹的路径。在我的电脑上,这是z:\dev\boost_1_43_0\lib;根据您的帖子,您的可能是I:\SophisPal\boost-1_43_0-vc10-32\lib

您不需要明确告诉链接器您要链接哪些库;Boost 标头使用 Visual C++#pragma指令之一来告诉链接器需要使用哪些库。

就这样,您应该能够构建和运行调试和发布配置。我完全完成了这些步骤,没有任何问题。

如果可行,我将开始修改项目,一次一个选项,直到它与您当前项目的配置相匹配。最终某些东西会使其停止工作,然后您就会知道问题所在。

如果这不起作用,我会考虑下载 Boost 源并重新构建它。

于 2010-05-30T00:56:50.293 回答
1

这是 boost 1.43 中的设计,但此后已修复。有关详细信息,请参阅此线程

于 2010-08-31T19:44:51.497 回答
1

由于您尝试创建一个新的基本项目并简单地包含我建议重新编译 boost.js 的标头,因此您要么构建错误,要么搞砸了项目设置。您可以从 boost.org 链接的 sourceforge 下载最新版本 1.45。当你在那里时,抓住最新的 bjam。您可以从 Visual Studio 命令提示符运行以下命令以在 64 位和 32 位中构建 boost:

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 参考是指英特尔的通信服务框架开源电话项目,我之前曾参与过该项目,并且在当天使用该项目升级提升所破坏的东西比它修复的要多......公平警告。

于 2010-12-23T23:33:47.617 回答