Можно ли попросить Аду не ловить EXCEPTION_ACCESS_VIOLATION - PullRequest
0 голосов
/ 14 сентября 2018

У нас есть большая система Ada / C ++ (использующая Gnatpro 7.3.2), работающая в Windows, которая очень редко дает сбой при нарушении памяти Windows 0xC0000005.Я попытался упростить, создав небольшую программу Ada, которая вызывает библиотеку C ++, и библиотека пытается писать по адресу 0x07.Но в этом случае вместо получения ожидаемого C0000005 подсистема Ada сообщает об ОШИБКЕ ПРОГРАММЫ с сообщением EXCEPTION_ACCESS_VIOLATION и хорошей трассировкой стека.

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

1 Ответ

0 голосов
/ 14 сентября 2018

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

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

  2. В: Что я могу сделать в моем приложении 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;
...