我有一个在嵌入式 Windows XP 机器上运行的 DX9 应用程序。当让它自动化过夜进行浸泡测试时,它会在大约六到八小时后崩溃。在我们的开发上。机器(Win 7)我们似乎无法重现此问题。我也相当确定这不是内存泄漏。
- 如果我们在嵌入式计算机上以“调试”方式运行相同的应用程序,它不会崩溃。
- 如果我们在嵌入式计算机上的主循环更新周围放置
__try/__ except
,它就不会崩溃。
我知道在调试中,本地堆栈周围有一些额外的字节填充,这可能会“隐藏”超出范围的本地数组访问,或者某种未初始化的变量正在潜入。
所以我有两个问题:
- 即使在发布版本中运行,
__try/__ except
的行为是否与调试类似? - 如果我们在 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/