У нас есть большая система Ada / C ++ (использующая Gnatpro 7.3.2), работающая в Windows, которая очень редко дает сбой при нарушении памяти Windows 0xC0000005. Я попытался упростить, создав небольшую программу Ada, которая вызывает библиотеку C ++, и библиотека пытается писать по адресу 0x07. Но в этом случае вместо получения ожидаемого C0000005 подсистема Ada сообщает об ошибке PROGRAM с сообщением EXCEPTION_ACCESS_VIOLATION и хорошей трассировкой стека.
Чтобы найти эту редкую ошибку, я сначала написал программу на C ++, написав по адресу 7, что, как и ожидалось, вызвало C000005, но при этом используется среда выполнения MSVC. Моя маленькая программа Ада показывает другое поведение. Можно ли отключить слой времени выполнения Ada, который ловит нарушение памяти?
Вы на самом деле задаете пару разных вопросов здесь:
Вопрос: В чем разница между (Windows) 0xc0000005 нарушением прав доступа и ОШИБКОЙ ПРОГРАММЫ Ada / EXCEPTION_ACCESS_VIOLATION?
Q: Что я могу сделать с этим в моем приложении Ada?
Чтобы лучше понять 0xc0000005, посмотрите здесь:
Какова область нарушения прав доступа «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;
Других решений пока нет …