Восстановление из исключений - PullRequest
0 голосов
/ 29 марта 2012

В нашем приложении (c ++) мы загружаем сторонние DLL, используя LoadLibrary. Иногда эти библиотеки DLL вызывают исключения, например «Место чтения нарушения доступа 0x00000000 ..».

Можно ли восстановиться после такого исключения, например, используя try & catch или какой-либо другой механизм? в другом мире возможно ли создать «песочницу» в том же процессе, который выдерживает такие события?

Спасибо

Ответы [ 6 ]

4 голосов
/ 29 марта 2012

Нет. Это не. DLL имеет неограниченный доступ к контексту процесса, который ее вызывает. Вам необходимо запустить ненадежные библиотеки DLL в их собственном контексте процесса.

2 голосов
/ 29 марта 2012

В Windows с компилятором VisualStudio может использоваться механизм SEH .

__try
{
  char* ptr = 0;
  char val = *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
  std::cout<<"AV"<<std::endl;
}

Использовать опцию / EHa .

1 голос
/ 29 марта 2012

Люди, стоящие за Runtime-Compiled C ++, используют вещь, называемую Структурная обработка исключений для , их процедуры обработки сбоев DLL . Зайдите на их сайт или спросите их, хотите ли вы примеры кода.

Согласно MSDN, переключатель /EHa включает «Обработка исключений в C ++ со структурированными исключениями». Так что если вы используете компилятор msvc, вы можете попробовать это.

1 голос
/ 29 марта 2012

Это не возможно в c ++, если, это невозможно, выдает кросс-модули исключений больше, в любом случае у вас будет повреждение памяти в вашем приложении, поэтому вы должны выяснить, что идет не так в вашей dll.Вы можете проверить причину, по которой вы не можете выбросить исключение из DLL здесь: http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

1 голос
/ 29 марта 2012

Вы можете попробовать другой тип обработчика исключений:

__try
{
    // Code that might cause an access violation goes here. 

}
__except (EXCEPTION_EXECUTE_HANDLER)
{
    int code = _exception_code();

}

Однако будьте осторожны, такие обработчики нельзя использовать ни в одной подпрограмме, где объекты C ++ требуют разматывания стека, поскольку компилятор предупредит вас (раздраженно),

1 голос
/ 29 марта 2012

Вы можете попробовать флаг /EH - http://msdn.microsoft.com/en-us/library/1deeycx5%28v=vs.80%29.aspx - в Visual Studio, но исключения нарушения прав доступа, скорее всего, означают, что вы делаете что-то очень неправильно. Я позволил бы программе аварийно завершить работу и попытался бы устранить исключение, а не перехватывать его.

...