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

标签 c++ crash try-catch buildconfiguration

我有一个在嵌入式 Windows XP 机器上运行的 DX9 应用程序。当让它自动化过夜进行浸泡测试时,它会在大约六到八小时后崩溃。在我们的开发上。机器(Win 7)我们似乎无法重现此问题。我也相当确定这不是内存泄漏。

  • 如果我们在嵌入式计算机上以“调试”方式运行相同的应用程序,它不会崩溃。
  • 如果我们在嵌入式计算机上的主循环更新周围放置 __try/__ except,它就不会崩溃。

我知道在调试中,本地堆栈周围有一些额外的字节填充,这可能会“隐藏”超出范围的本地数组访问,或者某种未初始化的变量正在潜入。

所以我有两个问题:

  1. 即使在发布版本中运行,__try/__ except 的行为是否与调试类似?
  2. 如果我们在 Release模式下崩溃但在 Debug模式下不崩溃,我应该扫描代码以查找哪些内容?

最佳答案

如果您正在使用 __try{ } __ except(),则不应使用。
这些代码和 C++ 代码不能很好地混合。 (例如,您不能将 C++ 对象放在用这些对象包装的函数的堆栈上。如果您使用 catch(.. .) (带省略号)它的作用与 __ except()

基本相同

try..catch__try.. __ except 在调试和发布中的行为相同。

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

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 库以及提供给过滤器函数的信息,您可以编写一些代码来打印出崩溃的完整堆栈跟踪,包括符号和行号。

确保您将构建配置设置为为发布版本发出调试符号。它们只能提供帮助,而不会减慢您的应用程序(但可能会使其变得更大)

关于C++:__try...__except;在 Release模式下隐藏崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10692784/

相关文章:

C++无法实例化抽象类

c++ - Logging Guard 以限制半常量日志消息

c++ - 在 deadline_timer 等待时使用 io_service::post (boost)

android - 检查Android应用程序是否未安装,然后提示Toast消息

ios - 使用-rangeOfString:options的搜索栏崩溃的应用程序:

swift - 是否可以使用 "try?"在保护语句中检索异常?

c++ - 这两种说法的区别? - C++

qt - 解析 qt 崩溃转储

java - try catch 循环问题

sql-server - SQL Server try catch性能