捕获 C++ 访问冲突异常
Catch c++ Access Violation exception
我的代码的某些部分抛出了 C++ 访问冲突错误。我想“捕捉”它并记录故障线,以便我可以进一步调查。
我在这个线程中尝试了第一个答案:
Catching access violation exceptions?
不幸的是,到目前为止还没有运气。我在 Visual Studio 2019 年使用调试模式。有人知道如何记录故障线的方法吗?
您所指的“访问冲突”不会在格式正确的代码中发生。它始终是未定义行为的结果。
发生这种情况时,您的程序状态是未知的,并且以某种未指定和未知的方式损坏。您不能期望在程序中完成任何有意义的任务,因为程序的状态不再是已知的。我想如果操作系统以只读方式保护程序的代码段,你可以相信实际代码是完整的,但堆栈处于未知状态,你可以忘记堆,它的状态是完全未知的.
从有缺陷的程序中提取任何有用的诊断信息的唯一有意义的方法是使用外部调试器从外部视图分析和检查当时程序状态的冻结快照。
在 Windows 上,您可以使用 __try
... __except
来完成,如下面的简化示例所示:
__try
{
* (int *) 0 = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
std::cout << "Exception caught\n";
}
Microsoft 称此机制为 'structured exception handling',它 比 Unix 上的信号更强大 得多(并且确实可用),我鼓励您了解更多信息如果你想做这种事:
https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=msvc-170
我用它来捕获行为不佳的 ASIO 驱动程序中的异常,否则会导致我的应用程序崩溃。
我的代码的某些部分抛出了 C++ 访问冲突错误。我想“捕捉”它并记录故障线,以便我可以进一步调查。 我在这个线程中尝试了第一个答案: Catching access violation exceptions?
不幸的是,到目前为止还没有运气。我在 Visual Studio 2019 年使用调试模式。有人知道如何记录故障线的方法吗?
您所指的“访问冲突”不会在格式正确的代码中发生。它始终是未定义行为的结果。
发生这种情况时,您的程序状态是未知的,并且以某种未指定和未知的方式损坏。您不能期望在程序中完成任何有意义的任务,因为程序的状态不再是已知的。我想如果操作系统以只读方式保护程序的代码段,你可以相信实际代码是完整的,但堆栈处于未知状态,你可以忘记堆,它的状态是完全未知的.
从有缺陷的程序中提取任何有用的诊断信息的唯一有意义的方法是使用外部调试器从外部视图分析和检查当时程序状态的冻结快照。
在 Windows 上,您可以使用 __try
... __except
来完成,如下面的简化示例所示:
__try
{
* (int *) 0 = 0;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
std::cout << "Exception caught\n";
}
Microsoft 称此机制为 'structured exception handling',它 比 Unix 上的信号更强大 得多(并且确实可用),我鼓励您了解更多信息如果你想做这种事:
https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement?view=msvc-170
我用它来捕获行为不佳的 ASIO 驱动程序中的异常,否则会导致我的应用程序崩溃。