在什么情况下你必须在调试版本上工作?

时间:2014-07-10 09:51:02

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

鉴于您可以在http://msdn.microsoft.com/en-gb/library/fsk896zz.aspx中提到的发布版本中进行调试,在什么情况下您真的需要在开发过程中构建调试版本?

3 个答案:

答案 0 :(得分:1)

可以调试发布配置时,发布配置中的设置适用于发布版本(可能应该在开发生命周期中看到/维护)。

更改类似于该文章的步骤是您可能必须在某个时候恢复的步骤,除非向您的客户端发送调试信息是您想要做的。

在某些项目中,有三种维护构建配置:

  • debug:不支持优化和完整的诊断信息(针对开发人员的代码维护进行了优化)

  • 发布:构建客户将看到/购买的内容

  • 发布调试符号(类似于您询问的链接):这是用于测试; QA团队将测试与客户将看到的内容尽可能相似的内容,但如果它不起作用,开发人员应该有足够的上下文信息来调查问题。

答案 1 :(得分:0)

很大程度上取决于应用程序的类型,但通常,你 不想要两个不同的版本;你想工作和调试 您提供的相同构建。你所说的是最重要的 你 - 你通常不需要它的名字,因为它是 您使用的唯一配置。

这通常与微软所称的相当接近 调试构建;例如,它将assert有效,而不是 做了很多优化

例外情况是性能问题。如果你找到了 在你不能离开断言的情况下自己 您需要活动,数组中的边界检查等 您可能希望在您提供的代码中进行优化 有两个版本,一个用于测试和调试,另一个用于你 交付(这也需要测试)。原因是, 当然,调试优化代码非常困难,因为 生成的代码并不总是与什么密切对应 你写。还有很多调试器(包括VS. 和gdb,我认为)无法显示的价值 编译器已优化到寄存器中的变量。

在许多这样的情况下,您可能还想创建三个版本; 迭代器验证可能非常非常昂贵,您可以 我希望有一个可以关闭它的构建,但仍然没有 优化。 (如果需要等待20,那么调试非常痛苦 几分钟到达程序失败的地方。)

答案 2 :(得分:0)

为Release版本执行的优化使调试更加困难。

例如,

a = c;
b = d;

在Debug构建中,编译的代码将包含四个指令:

  1. 阅读c
  2. a
  3. 阅读d
  4. b
  5. 这是相当简单的,当逐行逐步执行程序时,执行第一行将运行指令1和2,允许我此后检查程序状态。

    相比之下,发布版本可能会注意到ab在内存中彼此相邻,cd也是如此,因此您可以使用只需一次访问即可同时阅读cd,并撰写ab

    现在我们只有两条指令,源代码行和机器指令之间没有明确的映射。如果您要求调试器跳过第一行,它将执行两条指令(这样您就可以看到结果),但是您永远无法获得两行之间的确切状态。

    这是一个简单的例子。通常,优化器会尝试将指令组合在一起,以便CPU最佳地加载指令。

    这尤其意味着将内存读取到前面,这样它们就有可能在计算中使用数据之前执行(否则,CPU必须停在那里并等待内存访问完成),混合浮动 - 点和整数运算(因为它们在不同的电路上运行并且可以并行化),并尽可能早地计算条件跳转的条件(因此指令预取机制知道是否跟随跳转)。

    简而言之,虽然可以使用Release版本进行调试,有时需要重现客户错误报告,但您确实希望在大多数情况下都可以预测Debug构建的行为。