- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
同样的源代码,编译成debug版本会抛出“debug assertion failed”。但编译成release版本后,可以正常执行。
那么谁能详细解释一下“debug assertion failed”是什么意思?
我很确定源代码中有问题。但是为什么编译成release版本可以正常执行呢?
最佳答案
C++ 没有“调试构建”和“发布构建”的概念。这只是 Microsoft Visual Studio 使用的约定,用于 IDE 中两种不同的默认配置。它甚至不是 Visual C++ 的东西,它只是在 IDE 中。
了解这些 Visual Studio 功能如何与标准 C++ 功能交互很重要 assert
和 NDEBUG
,所以让我试着解释一下:
Visual Studio“发布构建”配置的一个方面是 NDEBUG
预处理器宏默认为所有翻译单元定义(这或多或少意味着 “对于所有 .cpp 文件“ 在这种情况下)。相反,在“调试构建”配置中,NDEBUG
默认情况下没有为任何翻译单元定义。
NDEBUG
导致 assert
宏不执行任何操作。 assert
是验证代码某些假设的好方法。正如宏的名称所说,您可以使用它来断言前置条件、后置条件和不变量;您认为您的代码正确执行的事情。
如果断言失败,那么您就发现了一个错误。 您的代码没有按照您的预期行事。这是一个非常严重的问题,通常需要立即终止申请流程以防止出现进一步的问题。
Visual Studio 中“调试构建”配置的另一个方面是它改变了应用程序在断言失败时终止的方式,通过向您显示“调试断言失败”消息框来报告错误。
I am quite sure there is something wrong within the source code. But why it can be executed normally when compiled into release version?
您可能没有在自己的代码中使用 assert
,而是使用来自某个包含断言的库(也许是标准库?)的代码。例如,确保使用正确参数调用函数的断言。查看错误消息框的确切内容;它会给你一个提示。
尽管出现错误,您的程序仍继续运行是一件坏事。它可能表现出未定义的行为,而您没有注意到它在做奇怪的事情这一事实应该被认为是运气不好,因为对于未定义的行为,任何事情都可能随时发生。纯属巧合的正常运行只是隐藏了一个错误,该错误会在以后的某个时间点打击您。
Visual Studio 中“调试构建”和“发布构建”配置背后的逻辑是您在开发过程中发现所有错误,测试“调试构建”,而用户运行的“发布构建”没有更多错误检测,因为检测错误可能会减慢程序速度。
就我个人而言,我认为这种逻辑存在严重缺陷。考虑在默认情况下不在任何地方定义 NDEBUG
,仅在性能实际受到影响的翻译单元中启用它。即使您知道程序不是您认为的那样继续执行程序也是危险的,因为应用程序逻辑变得不确定。 assert
是专门设计的,您可以针对单个文件打开或关闭它。遗憾的是,此功能使用不多,它实际上关闭了许多程序中有值(value)的错误检测机制。
最后一句话:assert
应该只用于检测错误。您不应使用它来处理与外部资源相关的错误(内存不足、网络错误、文件系统错误)或错误的用户输入。
关于c++ - 什么是 "debug assertion failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884436/
测试返回类型为 bool 的方法时。 你应该: expected = true; Assert.AreEqual(expected, actual); 或 Assert.IsTrue(actual);
我最近在编写新的 NUnit 测试时尝试使用 Assert.Equals() 方法。执行此方法时会抛出一个 AssertionException ,说明Assert.Equals 不应该用于断言。 乍
在 Chai 断言库中,当我们已经有了“assert.deepEqual()”时,“assert.equal()”有什么用"和 "assert.strictEqual()"用于严格和深度相等断言?还提
有没有办法断言 puppet 中的变量(或更具体地说,事实)具有特定值,如果没有则中止安装? 对于背景,情况如下: 在大多数情况下,我可以引用主机名,但有时我需要使用 IP 地址。例如,我们的日志收集
喜欢什么: Assert.That(obj.Foo, Is.EqualTo(true)) 或 Assert.True(obj.Foo) 对我来说,这两个断言是等价的,那么应该首选哪个? 最佳答案 在这
如何在 xUnit 中找到多个断言或软断言?我发现 Nunit 有以下能力,试图在 xUnit 中找到类似的选项。 Assert.Multiple(() => { Assert.AreEqua
有什么区别: Assert.Equals和 Assert.AreEqual Assert.NotNull和 Assert.IsNotNull ... ? 最佳答案 Assert.Equals 是一个对
我想写一个像这样工作的断言函数: //the following expression outputs "assertion failed" to std::err and then terminat
有人可以指出差异吗? 以上确实是我的问题,但是如果您也可以与他们分享您的经验以及您为什么使用其中一个。 最佳答案 它们只是两个不同的库,因此只需查看功能,尤其是报告功能,然后选择即可。 因为我是 的作
我无法找到断言 1 失败但断言 2 通过的原因: var a = Test.test1; var b = Test.test1; a.Should().BeSameAs(b); //1 Assert.
我正在为每个步骤使用 NUnit 断言运行自动化 BDD 步骤,即 Then And 我的 UI 测试。 NUnit 断言仅限于每个方法。这意味着如果方法中的断言失败,则不会运行其他步骤。 我正在考虑
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我只是在寻找一些示例,说明何时适合使用 Assert.Catch 或 Assert.Throws 断言单元测试中抛出的任何异常。我知道我也可以使用 ExpectedException,但我特别想知道“
Assert.AreEqual 和 Assert.AreSame 有什么区别? 最佳答案 这意味着 AreSame() 检查它们是否是完全相同的对象 - 如果引用指示内存中的相同对象。 AreEqua
在C#中,有什么区别 Assert.AreNotEqual 和 Assert.AreNotSame 最佳答案 这里给出的几乎所有答案都是正确的,但可能值得举个例子: public static str
我曾经在 NUnit 中使用过它们,它们非常有用。知道如何做类似的事情吗? 编辑,代码示例: bool condition = false;//would be nice not to have th
关于Arrange-Act-Assert的经典测试模式,我经常发现自己在 Act 之前添加了反断言。这样我就知道传递的断言确实是作为操作的结果传递的。 我认为它类似于红绿重构中的红色,只有当我在测试过
每当我创建断言时,Eclipse 都会建议我从这两个包之一导入它。 例如,当我尝试使用 assertArrayEquals() 比较数组时Eclipse 建议从其中之一导入它 org.junit.As
每当我创建断言时,Eclipse 都会建议我从这两个包之一导入它。 例如,当我尝试使用 assertArrayEquals() 比较数组时Eclipse 建议从其中之一导入它 org.junit.As
我是一名优秀的程序员,十分优秀!