当堆损坏时,是否有任何方法防止应用程序崩溃C程序设计语言
有时在执行过程中,我在VS2010中尝试释放内存时会收到以下错误消息: Windows已在[APPNAME].exe中触发断点 这可能是由于堆损坏,这表明[APPNAME].exe或其加载的任何DLL中存在错误 这也可能是因为用户在[APPNAME].exe具有焦点时按F12 输出窗口可能有更多诊断信息 Wich表示堆或指针有问题 我的问题是,当我的应用程序构建为发行版时,此错误会使其崩溃 此外,这只是一个更大的应用程序模块,当它崩溃时,一切都会停止 我希望能够处理这个错误 从msdn中选择“免费”: 如果释放内存时发生错误,将使用操作系统提供的有关故障性质的信息设置errno。有关更多信息,请参阅错误号、\u doserrno、\u sys\u errlist和\u sys\u nerr 有一个当堆损坏时,是否有任何方法防止应用程序崩溃C程序设计语言,c,memory,free,heap,C,Memory,Free,Heap,有时在执行过程中,我在VS2010中尝试释放内存时会收到以下错误消息: Windows已在[APPNAME].exe中触发断点 这可能是由于堆损坏,这表明[APPNAME].exe或其加载的任何DLL中存在错误 这也可能是因为用户在[APPNAME].exe具有焦点时按F12 输出窗口可能有更多诊断信息 Wich表示堆或指针有问题 我的问题是,当我的应用程序构建为发行版时,此错误会使其崩溃 此外,这只是一个更大的应用程序模块,当它崩溃时,一切都会停止 我希望能够处理这个错误 从msdn中选择“免
errno\u t\u get\u errno(int*pValue)代码>返回错误代码的函数
如果在上面显示的错误消息上按continue,此函数将返回错误代码。
使用这段代码,我可以检测错误,创建调用堆栈并轻轻退出我的函数
是否有任何编译器开关或其他东西来防止应用程序在free失败时崩溃,并允许我以自己的方式退出它???理论上,您尝试使用SEH来防止应用程序崩溃。
AFAIK“调试断点”是一种SEH异常,可以处理
__try {
// do something here
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
上述代码> > >除块外,将捕获所有异常(C++和SEH)。
但是
我相信你不应该这样做。堆损坏,以及任何其他无效内存访问-是一个错误,一旦发生这种情况-损坏通常是不可恢复的。您可以防止崩溃(希望如此),但您不能保证您的程序能够完成它应该做的事情。从现在起,它可能会在任何其他地方坠毁
与其防止崩溃,我建议你找一个敢于覆盖被禁止的内存并破坏堆的不法分子。理论上,你可以尝试使用SEH防止你的应用程序崩溃。
AFAIK“调试断点”是一种SEH异常,可以处理
__try {
// do something here
} __except(EXCEPTION_EXECUTE_HANDLER) {
}
上述代码> > >除块外,将捕获所有异常(C++和SEH)。
但是
我相信你不应该这样做。堆损坏,以及任何其他无效内存访问-是一个错误,一旦发生这种情况-损坏通常是不可恢复的。您可以防止崩溃(希望如此),但您不能保证您的程序能够完成它应该做的事情。从现在起,它可能会在任何其他地方坠毁
与其防止崩溃,我建议您找到敢于覆盖禁止内存并损坏堆的不法分子。修复代码,而不是试图忽略如此严重的错误。生产代码中不应该有如此严重的内存错误。好了,没有简单的方法来处理这个问题,这是有充分理由的。
顺便说一句,我认为对话框只在调试模式下出现。在释放模式下,不应检测到内存错误,应用程序应立即崩溃(或使用损坏的堆运行,yuk)。修复代码,而不是试图忽略如此严重的错误。生产代码中不应该有如此严重的内存错误。好了,没有简单的方法来处理这个问题,这是有充分理由的。
顺便说一句,我认为对话框只在调试模式下出现。在释放模式下,不应检测到内存错误,应用程序应立即崩溃(或使用损坏的堆运行,yuk)。如果堆损坏,则所有赌注均无效。内存分配可能会失败(除非它们在堆栈上),它们可能会返回指向异常区域的指针,甚至堆上现有的东西也可能被弄得面目全非。在这种情况下,你最好还是崩溃,因为你采取的任何行动(甚至试图优雅地退出)只会让事情变得更糟
找到损坏堆上内容的代码,并修复或删除它。如果堆损坏,则所有赌注都无效。内存分配可能失败(除非它们在堆栈上),它们可能返回指向古怪区域的指针,甚至堆上的现有内容也可能损坏得无法识别。在这种情况下,你最好还是崩溃,因为你采取的任何行动(甚至试图优雅地退出)只会让事情变得更糟
查找堆上损坏内容的代码,并修复或删除它。许多Windows程序使用HeapEnableTerminationOnCorruption
来确保在检测到堆损坏时程序立即崩溃。这是一种安全措施,因为堆损坏可能会被利用。立即崩溃堆损坏是唯一明智的做法
但是,如果您正在尝试调试,并且这是一个发布版本,则此设置可能会使调试问题变得困难。听起来你有一个模块在别人的应用程序中运行(尽管我不确定你的描述)。在这种情况下,可能是另一个应用程序正在设置堆终止标志。不幸的是,一旦设置(每个进程)它就不能取消设置
当崩溃发生时,您需要附加一个调试器来生成转储文件,并尝试从中进行调试。许多Windows程序使用HeapEnableTerminationOnCrruption
来确保在检测到堆损坏时程序立即崩溃。这是一种安全措施,因为堆损坏可能会被利用。立即崩溃堆损坏是唯一明智的做法
但是如果你想去deb