Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调试模式还是发布模式_C++_Visual Studio_Debugging_Conditional Compilation - Fatal编程技术网

C++ 调试模式还是发布模式

C++ 调试模式还是发布模式,c++,visual-studio,debugging,conditional-compilation,C++,Visual Studio,Debugging,Conditional Compilation,最近,我正在将物理引擎集成到我的图形引擎程序中。在此之前,我总是在调试模式下构建我的程序,因为我觉得调试意味着安全和更多的信息,让我知道哪里出错了 在我的程序中,我在发布模式下构建了Assimp,但直到现在我仍然在调试模式下使用它。现在,我在发布模式下构建Bullet Physics,因为调试模式下的性能有很大的不同。如果你想知道它有多慢,你可以看看 重要的是,我无法在调试模式下使用此*.lib文件,因此我有一个问题,您何时或为什么从调试模式更改为释放模式,或者从另一方面更改为。或者在调试模式下

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

在我的程序中,我在发布模式下构建了Assimp,但直到现在我仍然在调试模式下使用它。现在,我在发布模式下构建Bullet Physics,因为调试模式下的性能有很大的不同。如果你想知道它有多慢,你可以看看

重要的是,我无法在调试模式下使用此*.lib文件,因此我有一个问题,您何时或为什么从调试模式更改为释放模式,或者从另一方面更改为。或者在调试模式下使用发布库?现在,我想我需要为子弹物理永久改变释放模式,不知道这是好是坏

编辑:

我知道发布和调试模式的好处,因为stackoverflow中有很多可能重复的文章,但我想知道的是,当你制定一个程序时,你应该选择什么,或者仅仅因为遇到性能问题,所以需要像我一样将程序重新构建到发布模式。我只想澄清一下可能重复的文章之间的一些不同:)

这个问题有四种情况

案例1。启动新项目并在调试模式下编程,因为

案例2。启动一个新项目并以发布模式编程,因为

案例3。在调试模式下工作一段时间,但由于

案例4。在发布模式下工作一段时间,但由于

我真的很想知道这四个案件的判决是什么。在案例3中,由于Bullet物理的性能,我决定让程序永远处于发布模式,并让其他调试库重新构建为发布模式。在案例3中,问题是,我只使用第三方库,所以出于任何原因我需要使用调试模式吗?或者我只是进入释放模式

对于案例1和案例2,您是否决定了为什么让调试模式或发布模式来构建新程序

对于案例4,我想不出为什么要让一个人将发布模式更改为调试模式,但可能有一个实际的案例?除了建造图书馆,你可以做出这个决定

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

需要调试某些内容时,请使用调试(未优化)版本。它们生成的代码(速度慢)与源代码非常匹配,因此您可以更轻松地进行调试

为您发布的代码使用发布(优化)版本。它们生成的代码运行速度快得多(通常是数量级),但调试优化的代码确实很困难,因为生成的代码通常与您编写的源代码非常不同

在同一个程序中混合作为调试/发布版本构建的对象通常是灾难(崩溃)的一种结果(尤其是在Microsofts编译器中);“调试模式”和“发布模式”是两组预定义的编译器开关。但是,您可以覆盖它们,并创建中间表单。C++通常从内联中获益很多,因此使用内联生成进行调试是一种合理的中间形式。另一个常见的变化是使用C+C++库的发布版本,甚至在调试版本中。

您甚至可以覆盖单个文件级别上的开关。您的子弹物理可能是正确的,因此您可能需要检查它们是否可以用


也就是说,在处理不同的问题时,在调试和发布模式之间切换是很常见的。

注意,Microsoft编译器提出了一种“RelWithDebInfo”模式,在该模式下,您可以获得(部分)可调试的优化代码。始终从调试版本开始,以消除代码中的错误。然后,需要测试发布版本,以验证您首先选择C++的原因。您需要使用完整的预期数据集检查您的程序是否有足够的性能。如果不是这样,那么您需要一个探查器来查找热点。始终部署发布版本。gdb、lldb、Visual Debugger等调试器在发布模式下很难使用-某些函数丢失(内联),指令重新排序使它们在step命令上前后跳跃。由于调试器是查找bug的非常有效的工具,因此最好从调试模式开始,除非您计划不使用它们。还值得注意的是,当同一错误代码可能使程序在发布版本中崩溃时,调试版本往往会默默地处理一些未定义的行为类,因此密集测试几乎只应在发布版本上进行。@Token但是,这个问题怎么办?你能分享一下关于这个问题的最新信息吗?