gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:45 32 4
gpt4 key购买 nike

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

  • 如果我们在嵌入式机器上的 Debug 中运行相同的应用程序,它不会崩溃。
  • 如果我们在嵌入式机器上的主循环更新周围放置一个 __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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com