代码之家  ›  专栏  ›  技术社区  ›  the_drow

boost.thread在vs2010中抛出了坏的alloc异常

  •  1
  • the_drow  · 技术社区  · 15 年前

    包括在内 <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 回复  |  直到 12 年前
        1
  •  1
  •   criddell    15 年前

    这是在助推器1.43的设计,但已被修复。见 this thread 有关详细信息。

        2
  •  2
  •   David Gladfelter    15 年前

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

    换句话说,您是否尝试过用bootstrap.bat编译的库进行全新的boost安装,并且删除了您机器上的所有其他boost实现?在你做到这一点之前,你是在建立一个不太稳固的基础。

    如果在那之后仍然有麻烦,您尝试过调试-gt异常并打开第一次机会C++和Win32异常,这样您就可以在调试器中看到调用堆栈了吗?如果不起作用,您是否尝试过使用win32 API? SetUnhandledExceptionFilter() ,传入使用 MiniDumpWriteDump() API DBGHELP.DLL 要将进程的小型转储文件(*.dmp)写入一个文件,然后可以使用vs 2010调试器进行事后调试吗?

        3
  •  2
  •   Tom Smilack    12 年前

    我在G++-Boost版本1.47.0的4.6.1中遇到了类似的问题。

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

    解决办法是把所有 pragma pack(x) 使用GNU型包装 "__attribute__((packed))" 对于所需结构

    在与库链接时,boost应该更好地指向错误/警告。

        4
  •  1
  •   James McNellis    15 年前

    我建议您尝试创建一个新的、空的win32控制台应用程序(我通常选中“空项目”复选框,这样就不会得到预编译的头文件,对于小项目也是如此)。

    添加一个 CPP 将文件提交给项目并将内容提供给它。

    在项目属性中,在 C/C++ ,在 其他包含目录 框中,将路径添加到顶级boost文件夹(包含名为 促进 有所有的头文件)。在我的情况下,它是 Z:\dev\boost_1_43_0 ;根据你的帖子,你的可能是 I:\sophispal\boost-1_43_0-vc10-32 \include\boost-1_43 .

    也在项目属性中,在 链接器-常规 ,在 其他库目录 框中,将路径添加到包含已编译的boost库的文件夹中。在我的电脑上,这是 Z:\dev\boost_1_43_0\lib库 ;根据你的帖子,你的可能是 I:\sophispal\boost-1_43_0-vc10-32\lib .

    您不需要显式地告诉链接器您想链接哪些库;Boost标头使用VisualC++中的一个 #pragma 指示告诉链接器需要使用哪些库。

    只有这样,您才能够构建和运行调试和发布配置。我完全按照这些步骤进行,没有任何问题。

    如果可以,我将开始修改项目,一次一个选项,直到它与您当前项目的配置相匹配。最终,一些事情会使它停止工作,然后你就会知道问题是什么。

    如果 工作时,我会看看如何下载这个增强源并重新构建它。

        5
  •  1
  •   Assaf Lavie    15 年前

    一些想法:

    你怎么知道车祸发生了? 之后 (?)

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

    你能贴出车祸的痕迹吗?

        6
  •  1
  •   Tamara Wijsman    15 年前

    您应该使用类似 VLD (Windows)或Valgrind(Linux)检查它是否会指向错误的分配,可能您有一个Boost库版本,其中包含与当前编译器不兼容的bug,您可能需要应用修复程序。

        7
  •  1
  •   AJG85    14 年前

    您要么有一个坏的构建或混乱的项目设置,因为您已经尝试创建一个新的基本项目,只是包括标题,我建议重新编译boost。您可以从sourceforge下载最新版本1.45,该版本链接到boost.org。当你在那里的时候,带上最新的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引用的是英特尔的通信服务框架开放源代码电话项目,那么我之前就做过这个项目,并且在升级Boost的时候,那个项目在一天中破坏的东西比它修复的要多……公平警告。