2016-11-13 105 views
2

最近,我正在将物理引擎集成到我的图形引擎程序中。在此之前,我总是以调试模式构建我的程序,因为我觉得调试意味着安全,并提供更多信息让我知道哪里出错。调试模式或发布模式

在我的程序中,我在Release模式下构建了Assimp,但直到现在我仍然在Debug模式下使用它。就目前而言,我在Release模式下构建Bullet物理因为调试模式下的性能大不相同。如果你想知道它有多慢,你可以看到this

重要的是,我无法在调试模式下使用该* .lib文件,所以我有一个问题,何时或为什么要从调试模式更改为发布模式或另一方面。或者在调试模式下使用发布库?就目前而言,我认为我需要永久性地改变为“释放”模式以用于子弹物理学,并且不知道这是好还是坏。

编辑:

我知道释放和调试模式benifit,因为有很多计算器可以复制的文章,但我想知道的是,当你做一个节目是什么决定了选择或仅仅是因为遇到一个性能问题,所以需要重新编译为像我这样的发布模式。我只是想澄清可能重复的文章之间有点不同:)

这个问题有四种情况。

案例1.由于...,在调试模式下启动一个新的项目和编程。

第2种情况。由于......而在Release模式下启动一个新的项目和编程。

第3种情况。在调试模式下工作一段时间,但由于...更改为发布模式。

案例4.在发布模式中工作一段时间,但由于......而更改为调试模式。

我真的很想知道四种情况下的决定。我在案例3中,由于子弹物理的性能,我决定让程序永远成为发布模式,并且让其他调试库重建为发布模式。在案例3中,问题是,我只是使用第三方库,所以我需要使用调试模式出于任何原因?或者我只是去释放模式?

对于案例1 & 2,是否有任何决定你为什么让调试模式或发布模式来建立你的新程序。

对于情况4,我想不出为什么让一个人将发布模式更改为调试模式,但也许有实际情况?除了建立图书馆,你可以做出这个决定。

如果我的问题不够清楚,请告诉我。

+1

总是从Debug构建开始,以获取代码中的错误。然后,您需要测试Release版本以验证您首先选择C++的原因。您需要使用完整的预期数据集检查您的程序是否具有足够的性能。如果不是,那么你需要一个探查器来寻找热点。始终部署发布版本。 –

+1

像gdb,lldb,Visual Debugger这样的调试器在发布模式下很难使用 - 一些函数缺失(内联),并且指令重新排序使得它们在步骤命令中向前和向后跳转。由于调试器是查找错误的非常高效的工具,因此最好先从调试模式开始,除非您打算不使用它们。 – Franck

+1

值得注意的是,当相同的错误代码可能会使程序崩溃时,通常调试版本会倾向于默默地处理某些未定义行为类,因此密集型测试几乎完全在发布版本上完成。 – Jack

回答

0

当您需要调试某些东西时,使用调试(未优化)构建。它们会生成(缓慢)与您的源代码紧密匹配的代码,以便您更轻松地进行调试。

为您发布的代码使用发布(优化)构建。他们生成的代码运行速度更快(数量级经常),但调试优化的代码非常困难,因为生成的代码通常与您编写的源代码大不相同。在同一个程序建成调试/释放

混合的对象往往是灾难(崩溃)一recipie(特别是与微软的编译器);所以不要那样做。

+0

请注意,Microsoft编译器提出了一个“RelWithDebInfo”模式,您可以在其中获得(部分)可调试的优化代码。 – jpo38

1

“调试模式”和“释放模式”是两个预定义集合编译器开关。但是,您可以覆盖它们,并创建中间形式。 C++通常从内联中受益良多,因此带内联调试版本是一种合理的中间形式。另一个常见变体是即使在调试版本中也使用C++库的发布版本。

您甚至可以覆盖单个文件级别的开关。你的Bullet物理可能是正确的,所以你可能要检查,如果他们能与

这就是说,它是相当常见的解决不同的问题时,调试和发布模式之间翻转进行编译。

相关问题