调试代码比发布代码运行的时间长几个数量级

时间:2012-03-11 22:20:18

标签: c++ visual-studio debugging optimization serialization

我有大量的代码,在Visual Studio的调试模式下运行大约需要5分钟,在发布模式下运行大约需要10秒。

当我必须在程序结束时调试代码时,这将成为一个巨大的问题,我必须等待太长时间才能使程序达到断点。

我给了序列化一个镜头,并使用boost :: serialize序列化调试代码之前的所有变量,但事实证明,反序列化所有这些变量仍然需要一两分钟。

那是什么给出的?我知道在调试模式下运行代码时会禁用许多优化和内联函数,但是我觉得非常奇怪的是,在调试模式下运行代码需要花费将近2个数量级。是否存在程序员用来绕过这个等待时间的黑客或东西?我知道有很多程序比我的计算密集程度更高,但我非常怀疑他们会等待5分钟只是为了让他们的调试代码达到一个断点。

3 个答案:

答案 0 :(得分:2)

  

我有大量的代码,在Visual Studio的调试模式下运行大约需要5分钟,在发布模式下运行大约需要10秒。

这是正常的。

  

那是什么给出的?我知道在调试模式下运行代码时会禁用许多优化和内联内容,

这不是全部。除了msvc插入 MANY 健全性检查之外,特别是涉及stl容器时。例如,它会警告您关于不兼容的迭代器,std :: map中的命令比较器损坏以及许多其他类似问题。我认为它还在某种程度上检测内存损坏,缓冲区溢出,std :: vector的范围访问等等。这可能很有用,但开销很大。抛出一个特定的探测器,你的10秒也可以花30分钟完成。这也是正常的。

  

是否存在程序员用来绕过这个等待时间的黑客或东西?

除了使用它而不是#1 excuse ...
您可以在mingw上构建代码的调试版本 - 它不会插入(这种)健全性检查 您还可以调查源STL库并查看哪些宏启用了所有这些功能。它很可能被禁用。很有可能在msdn的某处记录了所述宏 您可以尝试为调试模式找到备用STL实现。 你也可以使用调试信息构建发布模式并调试它。

答案 1 :(得分:0)

OP在这里,所以我在发布没有连接调试器的发布版本时发现,发现VS2010终极版(也可能是快速版),当程序崩溃时会给你一个提示,询问你是否要调试或关闭程序(但在此之前它会询问您是否要中止,重试或忽略;选择忽略)。单击调试并在visual studio中选择当前打开的解决方案将加载代码并假装在调试程序时发生整个崩溃。

这实际上意味着如果你在你想要断点的代码中插入故意的故障,你可以在没有连接调试器的情况下以快速释放模式运行代码,并在程序崩溃后开始调试。为了强制崩溃,我创建了一个空向量,并尝试访问空向量的元素。

然而,这种方法有一个重大的挫折,因为它是一次性使用。在程序崩溃并开始调试之后,除了查看监视列表和其他变量之外,您无法执行任何操作,这意味着由于您在技术上没有运行启用调试的进程,因此无法设置其他断点。

当然,这是一个非常巨大的挫折,但这并不意味着该方法不会有它的用途。

答案 2 :(得分:0)

取决于您要调试的内容。如果您已准备好容忍某些奇怪的行为,您通常可以自定义要调试的内容。尝试使用发布模式库启用优化(保持启用调试信息)。

相关问题