代码之家  ›  专栏  ›  技术社区  ›  TC.

我如何才能找到一个罕见的错误,似乎只发生在发布版本?

  •  1
  • TC.  · 技术社区  · 15 年前

    我有一个相当大的解决方案,偶尔会崩溃。遗憾的是,这些崩溃似乎只发生在发布版本中。当我在崩溃时附加调试器时,会收到以下消息:

    “显示”

    这使得很难找到撞车的原因。我使用的是visualstudio2008的默认版本生成设置,其中“debug information format”设置为“Program Database(/Zi)”。

    你有什么小贴士可以帮我找到窃听器吗?例如,我是否可以更改项目中的某些设置,以便崩溃仍可能发生,但可以在调试器中获得更有意义的信息?

    更新: 这个问题是一个很少发生的逻辑错误,它本身不应该导致崩溃,但显然在其他地方导致了崩溃。解决逻辑错误解决了崩溃行为。

    对于任何来这里寻求解决类似问题的人:祝你好运,你会遇到困难。最终帮助我找到问题所在的是在代码中添加了大量边界检查(我可以使用预处理器指令启用/禁用这些检查),并为linux编译并使用gdb/valgrind运行。

    6 回复  |  直到 15 年前
        1
  •  4
  •   Hans Passant    15 年前

    我觉得那个架子好像被炸了。对于缓冲区溢出,只需在一个小char[]中复制一个大字符串就可以了。这就抹去了回信地址。代码一直运行到返回,然后当它从堆栈中弹出一个坏地址时就会爆炸。或者更糟的是,如果地址恰好有效。

    调试器无法显示任何有意义的内容,因为它无法遍历堆栈以显示代码是如何到达崩溃位置的。实际的坠机地点没有告诉你任何事情。

    把凝灰岩当作钉子来调试。你必须让它可复制,你需要步进或跟踪找到最后一个已知的好功能。跳出程序后产生崩溃的是有错误的程序。实际上,您可以看到造成损害的语句,调试器调用堆栈突然变得紧张。如果你不能得到一个一致的复制,那么彻底的代码审查是剩下的一切。你可以通过称之为“安全审查”来证明时间的合理性。祝你好运。

        2
  •  5
  •   Richard    15 年前

    首先确保您正在为发布版本构建构建符号(调试信息),并且调试器可以找到它们(这可能需要配置符号路径—最好是使用符号服务器)。

    其次,在调试时使用Modules视图确认已加载符号。

    .pdb

    退房 John Robbins blog

        3
  •  5
  •   Clifford    15 年前

    如果代码在应用优化后崩溃(如在默认版本中),那么很可能您的代码在某种程度上有缺陷,并且依赖于未定义的行为,这些行为在版本和调试版本之间会发生变化。

    尝试在发布版本中关闭优化以查看问题是否消失(或者在调试版本中打开优化以查看问题是否发生)。如果是这样的话,您仍然应该致力于找到并修复这个bug,但是您至少知道要寻找未定义的行为。

    将编译器警告级别设置为最大值(/W4),并将警告设置为错误(/Wx)和 修理 所有的警告(而不是简单地把所有的东西都投在眼前——想想看!)。当应用优化时,您可能会得到在调试版本中没有出现的警告,因为执行了更广泛的代码分析—这是非常有用的静态分析。

    如果您希望在优化的构建中打开调试,您可以这样做,但是您不太可能跟踪正在发生的事情,因为优化程序可能会重新排序代码,并删除代码和变量。

        4
  •  4
  •   Amardeep AC9MF    15 年前

    • 一些调试配置初始化所有变量。
    • 调试内存分配和释放可能更能原谅指针滥用。
    • 调试构建可能以不同的速度执行,从而掩盖竞争条件。

    可以通过添加带有时间戳的日志输出来跟踪竞争条件。你首先要通过观察车祸发生前发生的事情来缩小“大解决方案”中问题的范围。一定要使用延迟日志机制——一种稍后或在另一个线程中执行字符串处理的机制,这样它本身就不会对计时产生太大的影响。

        5
  •  1
  •   Jon Cage    15 年前

    你知道你仍然可以调试发布版本吗?只需按F5键(而不是CTRL+F5)即可在调试中运行。

    它是可重复的,也就是说,当它爆炸时,你是否在做一些具体的事情?

    如果是这样的话,在崩溃之前在代码中设置一个断点,然后按F5在debug中运行(确保使用的是发行版)。然后逐步执行,直到你的应用程序崩溃。我发现这比添加日志记录和调试打印语句要快。

    如果不是,在调试模式下运行有时会捕获错误并在有问题的行上停止。

        6
  •  0
  •   Rob    15 年前

    一个未斜体的变量(可能是指针)也可能导致问题。也许您应该在代码上运行一个静态分析程序- CppCheck