Можно ли сказать Аде не ловить EXCEPTION_ACCESS_VIOLATION

У нас есть большая система Ada / C ++ (использующая Gnatpro 7.3.2), работающая в Windows, которая очень редко дает сбой при нарушении памяти Windows 0xC0000005. Я попытался упростить, создав небольшую программу Ada, которая вызывает библиотеку C ++, и библиотека пытается писать по адресу 0x07. Но в этом случае вместо получения ожидаемого C0000005 подсистема Ada сообщает об ошибке PROGRAM с сообщением EXCEPTION_ACCESS_VIOLATION и хорошей трассировкой стека.

Чтобы найти эту редкую ошибку, я сначала написал программу на C ++, написав по адресу 7, что, как и ожидалось, вызвало C000005, но при этом используется среда выполнения MSVC. Моя маленькая программа Ада показывает другое поведение. Можно ли отключить слой времени выполнения Ada, который ловит нарушение памяти?

0

Решение

Вы на самом деле задаете пару разных вопросов здесь:

  1. Вопрос: В чем разница между (Windows) 0xc0000005 нарушением прав доступа и ОШИБКОЙ ПРОГРАММЫ Ada / EXCEPTION_ACCESS_VIOLATION?

  2. 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;
0

Другие решения

Других решений пока нет …