代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

为什么不调试就启动调试生成?

  •  4
  • fredoverflow  · 技术社区  · 15 年前

    在不调试的情况下启动调试生成有什么好处吗(与不调试的发布生成相反)?当我调试发布版本(而不是调试版本)时,我会错过什么呢?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    添加到阿德里安 answer 在谈到调试与发布版本时,一般来说:

    • 链接到调试或发布运行时libs(/MD vs./MDd)
    • NDEBUG (释放模式)或 _DEBUG (调试模式)已定义
    • _SECURE_SCL
    • 编译器优化已启用(在某种程度上)

    “调试构建”通常包括 _调试 , _SECURE_SCL=1 , /MDd 所有编译器优化都被禁用。这将导致“最安全”、“最检查”的执行模式,但也应该是可执行文件的最慢版本。 速度和安全系数应该完全独立于您是否在调试程序下运行程序! -- 调试版本为您提供了最大的安全性和错误捕获网络,完全独立于程序是否附加到调试器。

    使残废

    最后是全面优化。( /Ox +完全内联+可能是整个prg优化):虽然这是出于性能原因您希望发布的内容,但很有可能您的公司中没有足够的人员能够实际调试它。也就是说,给定一个崩溃转储,很可能有人需要一些asm知识和编译器输出的内容来理解崩溃转储(甚至是在调试器下实际运行时的一些随机断点)。同样,完全opt的优点/缺点与在调试器下启动/运行prg无关。

        2
  •  7
  •   Adrian Grigore    15 年前

    调试生成的最大优点(在IDE之外):

    • 断言已启用,您可能已在依赖调试的前置处理器部分中编译的其他诊断代码也已启用。

    最大的缺点:

    • 执行速度慢,内存消耗高,文件大小大。

    许多公司将调试版本分发给alpha和beta测试人员,并在稍后切换到发布版本。

        3
  •  0
  •   Armen Tsirunyan    15 年前

    例如,在不进行调试的情况下启动调试生成可以给您带来以下好处:如果使用无效索引对container进行索引,则断言将失败,在释放模式下,将获得未定义的行为。这是一个想法。在发布模式下调试时,您遗漏的是源代码行和程序集代码之间不再有对应关系,因为优化器已运行。所以在发布模式下调试要困难得多

        4
  •  0
  •   Dave    15 年前

    我将提供一个我无法解释的最新体验——有时当我运行应用程序时,在IDE中运行时会遇到未处理的异常。问题是,我 知道 我的异常正在被处理,而且我也知道我没有破坏抛出的异常(通过CTRL-D,E)。如果我多次点击F5,我的错误处理程序最终会捕获异常并正确处理它。

    我已经好几个星期没有找到这个原因了,所以当我不想中断执行时,我会在IDE之外运行,如果需要的话,稍后再附加到进程上。

    如果您确实需要在IDE外部运行时看到调试输出,并且没有使用log4net之类的东西来捕获所有内容,那么可以使用 DebugView 相反。