首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:__try...__except;在发布模式下隐藏崩溃?

C++:__try...__except;在发布模式下隐藏崩溃?
EN

Stack Overflow用户
提问于 2012-05-21 21:20:02
回答 2查看 1.9K关注 0票数 2

我有一个运行在嵌入式Windows盒上的DX9应用程序。当它在一夜之间自动进行浸泡测试时,它会在大约6到8个小时后崩溃。在我们的开发上。机器(赢7)我们似乎不能复制这个问题。我也很肯定这不是内存泄漏。

  • 如果我们在嵌入式机器上运行相同的调试应用程序,它不会崩溃;如果我们在嵌入式机器的主循环更新周围放置__try/__except,则不会崩溃。

我知道在Debug中,在本地堆栈周围有一些额外的字节填充,它们可能“隐藏”了本地数组超出界限的访问,或者某种未初始化的变量正在悄悄地通过。

所以我有两个问题:

  1. 的行为是否与调试类似,即使在中运行时,我也应该扫描代码,如果我们在发布模式下崩溃,而不是在debug模式下?。
EN

回答 2

Stack Overflow用户

发布于 2012-05-21 21:37:09

如果您使用的是__try{ } __except(),则不应该使用。

这些代码和C++代码不能很好地混合。(例如,不能将C++对象封装在函数的堆栈中。如果您使用C++ try {} catch() {} (带有省略号),则应该使用catch(...),它的作用与__except()基本相同。

try.. catch__try .. __except在调试和发布时的行为都是一样的。

如果您怀疑您的问题是意外异常,则应阅读以下所有内容:

代码语言:javascript
运行
复制
SetUnhandledExceptionFilter()
_set_se_translator()

_CrtSetReportMode()
_RTC_SetErrorFunc()
_set_abort_behavior()
_set_error_mode()
_set_new_handler()
_set_new_mode()
_set_purecall_handler()
set_terminate()
set_unexpected()
_set_invalid_parameter_handler()
_controlfp()

使用前两种方法中的一种可能会让您很快地找到问题所在。如果您希望对流程中可能出现的所有错误情况进行绝对控制,则其余部分都在其中。

具体来说,使用SetUnhandledExceptionFilter(),您可以设置一个函数过滤器,它记录导致异常的代码的地址。然后,您可以使用调试器来锁定该代码。使用DbgHelp库和提供给过滤器函数的信息,您可以编写一些代码,输出崩溃的完整堆栈跟踪,包括符号和行号。

请确保将构建配置设置为同时发出用于发布生成的调试符号。他们只能帮助你,不做任何事情来减缓你的应用程序(但也许会让它更大)

票数 3
EN

Stack Overflow用户

发布于 2012-05-21 21:44:47

--如果我们在嵌入式机器的主循环更新周围放置一个__try/__except,它就不会崩溃。

那就去做吧。

推荐的方法是围绕整个程序的单个__try块(以及每个工作线程的入口点),它允许您在退出之前写出崩溃转储和错误报告。SEH没有太多的恢复功能,因为异常没有足够的信息来区分不同的故障。但是,存储整个程序状态并将其拖到调试器中是非常有用的。

注意:一些视频驱动程序会导致SEH异常,它们也会捕捉到这些异常,也许有些逻辑期望安装一个以上的SEH作用域,这是您的__try块提供的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10692784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档