Visual C ++ App在Release中的main之前崩溃,但在Debug中运行正常

时间:2008-12-02 02:33:53

标签: visual-c++ cgal

在发布时,它会因未处理的异常而崩溃:std :: length error。

调用堆栈如下所示:

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 个答案:

答案 0 :(得分:3)

检查堆栈转储:

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 /您是否在XP之前运行此代码?我相信在XP中引入了光纤本地存储(__set_flsgetvalue)。这是一个很长的镜头,但无论如何我们需要清理它。

2 /您需要与CGAL联系吗?我假设您的应用程序需要CGAL库中的某些内容,否则不要与它链接。它可能是另一个项目文件的宿醉。

3 /如果您执行使用CGAL,请确保您使用的是最新版本。从3.3开始,它支持动态链接,这可以防止混合不同库版本(静态/动态和调试/非调试)的可能性。

4 /你能尝试用VC8编译吗? CGAL支持的平台 NOT 还包括VC9(VS2008)。您可能需要与CGAL团队本身进行跟进,看看他们是否正在开展这种支持。

5 /最后,你安装了Boost吗?这是另一个长镜头,但无论如何值得一看。

如果这些建议都没有帮助,你就不得不等待一个比我更了解的人,我担心。

祝你好运。

答案 1 :(得分:0)

main()之前的崩溃通常是由全局变量或静态变量中的错误构造函数引起的。

看起来像类Random

的构造函数

答案 2 :(得分:0)

你有一个Random类型的全局或静态变量吗?您是否有可能在其所在的库已正确初始化之前尝试构建它?

请注意,全局变量和静态变量的构造顺序并不固定,可能会从调试变为发布。

答案 3 :(得分:0)

您能否更具体地了解您收到的错误? (未处理的异常std :: length听起来很奇怪 - 我从未听说过它)

据我所知,如果FLS API不可用,FlsGetValue会自动回退到TLS对应物。

如果你仍然卡住了,请在崩溃时带上你的进程的.dmp并发布它(使用众多免费上传服务中的任何一个 - 并给我们一个链接)(听起来像一个缺失的功能在SO - 源/数据文件交换?)