Обработка ошибок при использовании неуправляемого кода в управляемом (C ++, C, C ++ / CLI, C #) - PullRequest
6 голосов
/ 15 июля 2011

Я использую плохо написанный сторонний (C / C ++) Api.Я использовал его из управляемого кода (C ++ / CLI).Получите иногда "ошибки нарушения доступа".И это сбой всего приложения.Я знаю, что не могу справиться с этими ошибками [что я могу сделать, если указатель обращается к неправильной ячейке памяти и т. Д.].

Но я не хочу, чтобы мое приложение зависало в целом.По крайней мере, если есть реальная проблема, мое приложение должно изящно сказать: «ОК. Я не могу выполнять свою работу. ПОЗВОНОК.» :-), тогда оно, по крайней мере, выполнит какую-то альтернативную сцену и, наконец, закроет себя.Кажется, нет никакого способа, чтобы поймать (может быть неправильный термин, может быть, слово должно быть информировано) нарушение доступа и аналогичные ошибки. Есть способ получить информацию об этих ошибках.Так что я могу выполнить свой альтернативный сценарий.

PS: стандартная обработка исключений не решает эту проблему.

#include "stdafx.h"
#include <iostream>

using namespace System;

using namespace std;


static void ThrowingManagedException()
{

    throw gcnew ArgumentException("For no good reason");

}

static void ThrowingNativeException()
{

    throw std::exception("For no good reason");



}

static void SomeBadThingsHappen()
{

    short a[1]; 

    a[0]=1;

    a[2]= 2; // SomeOne make stupid mistake

}

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Test Exceptions");

    try 
    {

        SomeBadThingsHappen();
         //ThrowingNativeException();         
         //ThrowingManagedException();
    }


    catch(Exception^ e)
    {
        Console::WriteLine("Something awful happened: "+ e);
    }


    Console::WriteLine("Press enter to exit");
    Console::Read();

    return 0;
}

1 Ответ

4 голосов
/ 15 июля 2011

Если вы уверены, что проблемы заключаются в ошибках в библиотеке, а не в результате передачи неверных аргументов, то наиболее надежным вариантом является межпроцессное взаимодействие с процессом хостинга, который загружает библиотеку. Таким образом, разделение процессов в ОС не позволяет библиотеке отключить ваше приложение.

Вы можете попытаться отследить нарушения доступа в процессе, используя SEH, но если библиотека записывает в подстановочные указатели, а не в простые нулевые указатели, процесс не выживет даже с обработчиком исключений.

Ваш пример не вызовет нарушения прав доступа, это переполнение буфера буфера в стеке, поэтому в соседней ячейке памяти содержатся другие допустимые данные, которые растоптаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...