我们有一个运行在Windows上的大型Ada/C++系统(使用Gnatpro 7.3.2),它很少会死机,并出现0xC0000005 windows内存冲突。为了简化,我创建了一个小的Ada程序,它调用了一个C++库,这个库试图写入地址0x07。但是在这种情况下,Ada子系统并没有得到预期的C0000005,而是报告了一个带有消息EXCEPTION_ACCESS_VIOLATION和良好堆栈跟踪的程序错误。
为了找到这个罕见的bug,我首先编写了一个写到地址7的C++程序,正如预期的那样导致了C000005,但它使用的是MSVC运行时。我的小Ada程序显示了不同的行为。是否可以禁用捕获内存冲突的Ada运行时层?
发布于 2018-09-14 06:38:51
您实际上在这里问了几个不同的问题:
要更好地理解0xc0000005,请查看以下内容:
What exactly is the scope of Access Violation '0xc0000005'?
为了处理Ada程序错误,为什么不使用标准的Ada“异常”块,例如:
with Ada.Exceptions; use Ada.Exceptions;
...
exception
when Error: EXCEPTION_ACCESS_VIOLATION =>
Put ("Access Violation: ");
Put_Line (Exception_Name (Error));
Put (Exception_Message (Error));
when Error: others =>
Put ("Something Else: ");
Put_Line (Exception_Information(Error));
end;https://stackoverflow.com/questions/52322120
复制相似问题