Inverse Heisenbug - 仅当附加调试器时单元测试才会失败

2023-11-29

我最近修复了我们产品中的一个缺陷,其症状是由于访问悬空指针而导致访问冲突。

为了获得良好的实践,我添加了一个单元测试以确保错误不会再次出现。在编写单元测试时,我总是会取消缺陷修复并确保单元测试失败,否则我知道它没有正确完成其工作。

在取消缺陷修复后,我发现我的单元测试仍然通过(不好)。当我将调试器附加到单元测试以查看其通过的原因时,测试失败了(即引发了异常),并且我可以中断并观察到调用堆栈与我修复的原始缺陷中的调用堆栈相匹配。

我没有修改 Visual Studio 2005 中的“异常中断”设置,这确实是一个关键的 Win32 异常,它会导致测试工具终止(即没有优雅的异常处理程序)。

异常的文本是:

Unhandled exception at 0x0040fc59 in _testcase.exe: 0xC0000005:
Access violation reading location 0xcdcdcdcd.

Note:位置并不总是0xcdcdcdcd (已分配但未写入的 Win32 堆内存)。有时是0x00000000,有时是另一个地址。

这似乎与传统的 Heisenbug 正好相反,当通过调试器观察问题时,问题就会消失。就我而言,通过调试器观察它会使问题出现!

我最初的想法是,这是调试器中的时序差异所暴露的竞争条件。但是,当我向代码添加跟踪并与调试器分开运行时,我打印出的数据向我表明应用程序应该以与在调试器下运行时类似的方式中止。但事实并非如此!

关于可能导致这种情况的原因有什么建议吗?


Update:我正在缩小这个问题的原因。看这个问题更多细节。如果我找到答案,将用答案更新这个问题。


通常,当您删除指向该内存的指针时,VC++ 调试器将用一些已知值填充堆分配的内存。我已经有一段时间没有使用 Visual Studio 了,但对我来说 0xcdcdcdcd 可能是这样一个值似乎是合理的。在我看来,应用程序在调试器中运行时很可能会正常崩溃。当在发布模式下运行时,运行时不会浪费时间覆盖已释放的内存,因此有时您会“幸运”并且存储在该内存中的数据仍然有效。

您可以修改构建设置,以打开在发布模式下用已知值填充已释放内存的选项(完成后不要忘记再次将其关闭)。我猜如果你这样做,你的应用程序会在发布模式下崩溃。

我知道该值并不总是 0xcdcdcdcd,这可能意味着我错了,或者可能意味着您有多个指向悬空指针的路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Inverse Heisenbug - 仅当附加调试器时单元测试才会失败 的相关文章

随机推荐

  • 命令“grunt server”的指南针错误

    我正在运行一个安装了nodeJs ruby yeoman compass等的项目 现在我用命令运行我的项目 gt grunt server or gt grunt server force 但它给了我罗盘的以下错误 E CRM worksp
  • 在 MYSQL 中从文本框中的逗号分隔文本添加新行

    我有一个 PHP MYsql 问题 我试图在每个逗号后插入一个新行 基本上 我想要这个功能 假设我们有一个包含以下文本的文本框 篮球 网球 足球 排球 gt 提交按钮 单击提交按钮后 我想在一个表中的每个单词后插入一个新行 基本上 我希望数
  • 在 Eclipse 上测试时如何传递 -D System 属性?

    我正在 Windows 上的 Eclipse 上进行开发 代码部署在 Unix 上 我正在使用 System getProperty key 获取系统属性值 如何在 Eclipse 中传递它 以便我不必修改代码并且它可以在 Eclipse
  • Delphi IDE 中出现“无法更改 OnShow 或 OnHide 中的可见项”错误

    我在使用 Delphi 2006 IDE 时遇到一个非常奇怪的问题 如果 IDE 最小化 并且 PC 被锁定 我返回电脑 解锁并最大化 IDE 有时会收到错误 无法更改 OnShow 或 OnHide 中的可见项 如果发生这种情况 我必须使
  • 挂钩 ASP.Net Core 的 Razor 页面执行

    我正在尝试加入ExecuteAsync 使用我的自定义视图页面 继承自RazorPage 在里面RazorPage类中有一个抽象方法 public abstract Task ExecuteAsync 解析 cshtml 文件 视图 时 该
  • 在 C++ 和 C# 之间传递向量结构

    我有 C 非托管代码 我想从 C 访问它 所以我遵循了一些教程 为我的项目构建了一个 dll 顺便说一句 只有一个类 现在我想从 C 使用它 我使用 p invoke 如下 我的问题是 是否可以编组我的窗口点 以便我可以将它作为向量传递到我
  • 在 Selenium Grid 中指定 Windows 版本(或特定机器)

    我正在设置一个 Selenium 网格 以便涵盖一个测试矩阵 该矩阵需要全面涵盖以下组合 提供相同服务的三台服务器 Windows Server 2003 2008 和 2012 和十个客户端 XP Win7 win8 和 win8 1 将
  • 两个第 n 个位置字符之间的正则表达式

    我试图根据位于两个字符 之间的文本字符串获取一些数据 但可能是第 n 个位置的单词 目前我有以下内容 2 处理以下数据 D20 Mbps U10 Mbps TC4 P 我期望得到的地方 U10 但当第一部分捕获时什么也得不到 D20 Mbp
  • 在 C# 中,如何实例化方法内传递的泛型类型?

    我如何实例化我的类型 TInstantiateType
  • 附近连接2.0:连接成功,立即断开连接

    我正在尝试将附近连接 2 0 与P2P CLUSTER连接策略 并且我在让我的设备连接并保持连接时遇到问题 根据我的跟踪日志 看起来设备已成功连接 然后立即断开连接 请注意 它有时也会成功运行相同的代码 然后保持连接 我不知道是什么让它有时
  • 如何使用 android facebook sdk 在朋友的墙上发布文本

    我正在尝试使用 Android Facebook sdk 在用户朋友的墙上发帖 我已使用类似的调用成功发布到用户自己的新闻源 使用我当前的代码 向朋友发帖可以顺利进行 只是消息是空白的 所有附件似乎都不起作用 它在朋友的墙上显示为完全空白的
  • 如何使整个html正文居中对齐?

    如何将整个 html 正文对齐到中心 我只是偶然发现了这篇旧帖子 虽然我确信 user01 早已找到了他的答案 但我发现当前的答案不太有效 使用其他人提供的信息进行了一些尝试后 我找到了一个适用于 IE Firefox 和 Chrome 的
  • 如何将 list 中的项目计数设置为特定数量

    我有课SimpleHistogram dt 接受一个通用数组DT 我应该设置特定的计数 即元素在数组中出现的次数item在数组中转为 intcount 这是我到目前为止所拥有的 public class SimpleHistogram dt
  • 程序未进入if语句

    在我的 python 程序中 没有输入 if 语句 我已将代码简化为以下内容 x 5 while x lt 5 if x 0 print 0 x 01 该程序不输出任何内容 但是 将最后一行更改为 x 5 会使程序输出 0 有什么问题吗 浮
  • $near 和 $within 之间的 MongoDB 地理空间差异

    有什么区别 near and within db geodata find loc within center 12 91365 77 59395 4 limit 10 db geodata find loc near 12 91365 7
  • 比较Python中的两个列表A、B,找到A中与B中相同数字对应的所有元素

    我想比较两个Python列表 A 和 B 以便我可以找到A 中的所有元素分别对应于B 中的数字相同 我想这样做是为了B 中的每个数字 例如 如果 A 5 7 9 12 8 16 25 B 2 1 3 2 3 1 4 我想得到 7 16 co
  • ASP.NET 应用程序从 Session.Remove 实现中抛出 System.NullReferenceException

    我们在 ASP NET Web 应用程序中收到随机 System NullReferenceException 我们正在使用进程内会话状态 堆栈跟踪 System NullReferenceException Object referenc
  • 扩展BufferedImage

    为什么下面的代码显示的是黑色图像而不是图片 如何正确扩展BufferedImage class SizeOfImage public static void main String args throws Exception URL url
  • 在Python中从命令行解析带有空格的字符串

    有没有办法在 python 中调用我的程序并向其传递一个我希望它解析的字符串而不将字符串声明为 String I want to parse but as String I want to parse import argparse Par
  • Inverse Heisenbug - 仅当附加调试器时单元测试才会失败

    我最近修复了我们产品中的一个缺陷 其症状是由于访问悬空指针而导致访问冲突 为了获得良好的实践 我添加了一个单元测试以确保错误不会再次出现 在编写单元测试时 我总是会取消缺陷修复并确保单元测试失败 否则我知道它没有正确完成其工作 在取消缺陷修