我有一个运行在嵌入式Windows盒上的DX9应用程序。当它在一夜之间自动进行浸泡测试时,它会在大约6到8个小时后崩溃。在我们的开发上。机器(赢7)我们似乎不能复制这个问题。我也很肯定这不是内存泄漏。
__try/__except
,则不会崩溃。我知道在Debug中,在本地堆栈周围有一些额外的字节填充,它们可能“隐藏”了本地数组超出界限的访问,或者某种未初始化的变量正在悄悄地通过。
所以我有两个问题:
发布于 2012-05-21 21:37:09
如果您使用的是__try{ } __except()
,则不应该使用。
这些代码和C++代码不能很好地混合。(例如,不能将C++对象封装在函数的堆栈中。如果您使用C++ try {} catch() {}
(带有省略号),则应该使用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库和提供给过滤器函数的信息,您可以编写一些代码,输出崩溃的完整堆栈跟踪,包括符号和行号。
请确保将构建配置设置为同时发出用于发布生成的调试符号。他们只能帮助你,不做任何事情来减缓你的应用程序(但也许会让它更大)
发布于 2012-05-21 21:44:47
--如果我们在嵌入式机器的主循环更新周围放置一个
__try
/__except
,它就不会崩溃。
那就去做吧。
推荐的方法是围绕整个程序的单个__try
块(以及每个工作线程的入口点),它允许您在退出之前写出崩溃转储和错误报告。SEH没有太多的恢复功能,因为异常没有足够的信息来区分不同的故障。但是,存储整个程序状态并将其拖到调试器中是非常有用的。
注意:一些视频驱动程序会导致SEH异常,它们也会捕捉到这些异常,也许有些逻辑期望安装一个以上的SEH作用域,这是您的__try
块提供的。
https://stackoverflow.com/questions/10692784
复制相似问题