发布模式下的异常,而不是调试模式下的异常

     2023-03-05     190

关键词:

【中文标题】发布模式下的异常,而不是调试模式下的异常【英文标题】:exception in release mode and not in debug mode 【发布时间】:2013-05-20 12:17:23 【问题描述】:

当我在调试模式下运行这段代码时没有出现异常,但在发布模式下我得到了这个异常:

RealTimeSLT.exe 中 0x768b4b32 处未处理的异常:Microsoft C++ 异常: cv::Exception at memory location 0x003de734..

为什么这个问题只在发布时出现?我该如何解决??

FileStorage fs2(fileName, FileStorage::READ);
fs2.open(fileName, FileStorage::READ);
fs2["Mat"] >> Mat;  
fs2["dMat"]>> dMat; 
fs2.release();

【问题讨论】:

OpenCV cv::FileStorage 类在无法打开文件时抛出异常。捕捉该异常并告诉用户选择另一个文件是明智的。或者在代码中使用文件的正确路径名。 你不需要调用open()作为之前已经使用指定参数调用它的行。基本上,您现在正在打开、关闭和重新打开文件。 如果路径不是明确的但相对于工作目录,当你运行可执行文件时它不会找到它是一个不同的目录。有时 Debug 和 Release 使用不同的工作目录。检查项目配置。 在 VS 调试版本中,未初始化的裸指针通常会代表您初始化为 null。如果您的代码中有任何裸指针忘记初始化为 null,它们将指向发布版本中的垃圾位置,取消引用将是未定义的行为。 【参考方案1】:

假设你在 VS 中运行,选择 Debug->Exceptions 并点击 'Break When Exception is Thrown'

在调试器下运行应用程序,看看为什么会抛出异常以及它抱怨什么 - 这很可能是应用程序运行环境不同的原因。

如果您需要检查变量,那么发布构建会使这变得困难,因为优化器可能会使调试器感到困惑。您可以通过关闭发布版本中的优化来解决这个问题。但是,如果是时间问题,这可能会隐藏问题。

另一个选项是捕获抛出的异常,然后记录其内部消息——这通常是一个名为“what()”或类似的函数。这很可能会指出实际问题。无论如何,您可能都希望捕获此异常。

如果它的未定义行为导致了 Release 和 Debug 之间的差异,那么上面的可能不会有那么多用处。

【讨论】:

【参考方案2】:

代码看起来很奇怪。

在不了解您的 FileStorage 对象的情况下,我可以看到您在第一行的堆栈上创建了一个

假设 release() 是某种引用计数方法,fs2.release() 将尝试删除它,因为引用计数为零。

删除已分配在堆栈上的对象不好。你会崩溃的。

无论是 (1),还是试试这个(即在堆上分配)

FileStorage fs2 = new FileStorage(fileName, FileStorage::READ);

(假设对象具有内置的引用计数语义;请查看文档)。

或 2: 删除最后一行,因为 fs2 将在堆栈展开时超出范围。

【讨论】:

虽然这在一般情况下可能是个好建议,但在这个特定的建议中你错了:OpenCV 的FileStorage::release() 不会删除对象,而是关闭文件并释放内部缓冲区。读完文件后调用它完全没问题,见docs.opencv.org/modules/core/doc/xml_yaml_persistence.html 奇怪的是调试和发布行为差异如此之大。这就是为什么我在考虑调试和释放堆时发现了错误的树。【参考方案3】:

当你处于发布模式时,你需要再次将“*.lib”文件添加到 vs 项目的链接器。 我认为这是2.4.1之后opencv的一个错误。

【讨论】:

【参考方案4】:

就我而言,这是因为 OpenCV 库是用 VS2010 构建的,而我使用的是 VS2015。

为了解决问题,我更改了我的项目属性 > 常规 > 平台工具集,以匹配用于构建我链接的 opencv 库的工具集。

【讨论】:

如何在 C++Builder 发布模式下找到异常,但不是调试

】如何在C++Builder发布模式下找到异常,但不是调试【英文标题】:HowtofindexceptioninC++BuilderReleasemode,butnotDebug【发布时间】:2021-06-2917:00:10【问题描述】:C++Builderv10.4.2,CLang64位编译器发布模式下的浮点错误,但调试中没有。当一... 查看详情

发布模式下的 Windbg 不起作用

】发布模式下的Windbg不起作用【英文标题】:Windbgonreleasemodedoesn\'twork【发布时间】:2012-06-0802:19:10【问题描述】:我编译了这个小型MFC应用程序,当我使用VS2010单击CButton时会引发异常。它处于发布模式并创建了pdb文件和地图文... 查看详情

IIS7 集成管道模式下的异常处理

...处理【英文标题】:ExceptionHandlinginIIS7IntegratedPipelineMode【发布时间】:2009-07-1222:39:32【问题描述】:我有一个托管在以集成模式运行的IIS7上的应用程序。我通过将以下内容放入Web.config来处理错误:<httpErrorserrorMode="DetailedLocalOn... 查看详情

MSBuild 在调试模式下工作,但不是发布模式 - 以及其他有趣的异常

】MSBuild在调试模式下工作,但不是发布模式-以及其他有趣的异常【英文标题】:MSBuildworkingindebugmode,butnotreleasemode-andanotherinterestinganamoly【发布时间】:2011-11-2217:24:36【问题描述】:我有一个基本的MSBuild脚本,其中包含一个项目... 查看详情

发布模式下的调试(优化开启时)和调试模式下的调试有啥区别?

】发布模式下的调试(优化开启时)和调试模式下的调试有啥区别?【英文标题】:WhatisthedifferencebetweenDEBUGoninReleaseMode(whileOptimizeison)andDebugginginDebugMode?发布模式下的调试(优化开启时)和调试模式下的调试有什么区别?【发布... 查看详情

Webpack source-map 指向 *.min.js 包,而不是生产模式下的源文件

...ksource-maptargetsto*.min.jsbundleandnottothesourcefilesinproductionmode【发布时间】:2021-12-0200:12:25【问题描述】:我们在webpack中开发和生产模式的配置几乎相同。在这两种情况下,我们都希望源映射能够在浏览器中进行调试。对于开发模式... 查看详情

我自己在调试模式下的二进制文件“二进制文件不是用调试信息构建的”

...Myownbinaryindebugmode"Binarywasnotbuiltwithdebuginformation"【发布时间】:2019-08-2410:33:38【问题描述】:我在Win10上使用VisualStudio2017版本15.9.6当我尝试使用断点调试我的应用程序时,我看到“断点不会被命中。没有为此文档加载任何... 查看详情

发布模式下的断点和调试

】发布模式下的断点和调试【英文标题】:Breakpointsanddebuginreleasemode【发布时间】:2016-05-0406:47:20【问题描述】:这是我第一次在VS中使用发布模式,我一直使用调试模式,我对如何在发布配置中优化代码印象深刻!但无论如何... 查看详情

为啥发布和调试模式下的代码行为不同?

】为啥发布和调试模式下的代码行为不同?【英文标题】:Whyiscodebehaviordifferentinrelease&debugmode?为什么发布和调试模式下的代码行为不同?【发布时间】:2017-12-0110:57:34【问题描述】:考虑以下代码:privatestaticvoidMain(string[]args... 查看详情

ia-32e模式下的异常处理

系统异常处理CPU如果调用系统异常处理程序需要的数据结构IDT_Table:中断向量表,在中断向量表中的每一项都是一个中断描述符(中断门或者陷阱门),一个中断描述符中的几位是段选择符GDT或者LDT处理过程(没有特权变化的情况)中断... 查看详情

发布模式下的 ClickOnce 不会发布

】发布模式下的ClickOnce不会发布【英文标题】:ClickOnceinReleasemodedoesn\'tpublish【发布时间】:2009-06-0116:31:37【问题描述】:只需使用ClickOnce进行一些测试/原型设计。有谁知道为什么我可以在设置为“调试”模式时使用CLickOnce发布... 查看详情

调试模式下的directx音频视频错误消息

...误消息【英文标题】:directxaudiovideoerrormessageindebugmode【发布时间】:2009-08-1109:10:52【问题描述】:我有一个c#/winforms应用程序,它使用directx来播放一些视频和音频。每当我在调试模式下启动我的应用程序时,我都会收到这条烦... 查看详情

从调试模式切换到发布模式时,C# Asp.Net Webservice 抛出异常

】从调试模式切换到发布模式时,C#Asp.NetWebservice抛出异常【英文标题】:C#Asp.NetWebservicethrowsExceptionwhenswitchingfromDebugtoReleaseMode【发布时间】:2013-06-2408:14:54【问题描述】:我的网络服务在调试模式下运行良好,但是当我将其切... 查看详情

ideadebug断点调试技巧

...的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。一、Debug开篇  首先看下... 查看详情

带有 multidex 的 Xamarin Android - 调试模式下的错误

...的错误【英文标题】:XamarinAndroidwithmultidex-bugindebugmode【发布时间】:2017-11-1221:15:28【问题描述】:我创建了XamarinForms应用程序。我为Android使用multidex(许多库)。我使用带有MultiDexMainDexList选项的multidex.keep文件。现在部署工作... 查看详情

如何确定是不是启用了“调试模式”

...ot;debugmode"isenabled如何确定是否启用了“调试模式”【发布时间】:2011-04-1603:04:08【问题描述】:Java程序如何确定它是否在调试模式下运行?应用程序在常规“全速”模式下的行为应该与“调试模式”(连接调试器时,在调... 查看详情

错误只出现在发布模式而不是调试模式

】错误只出现在发布模式而不是调试模式【英文标题】:Erroronlyappearsinreleasemodeandnotindebugmode【发布时间】:2020-02-2319:53:21【问题描述】:在调试模式下一切正常,但是当我在发布模式下运行应用程序时,它会产生以下屏幕:当... 查看详情

Spark集群模式下的Impala JDBC连接问题

...问题【英文标题】:ImpalaJDBCconnectionissueinsparkclustermode【发布时间】:2018-02-2607:59:18【问题描述】:在集群模式下运行spark作业时,Impalajdbc连接抛出异常。Spark作业创建hive表并使用JDBC使impala表无效/刷新。相同的作业在spark客户端... 查看详情