Не может обработать исключение AccessViolationException

269
15 октября 2017, 20:28
Приложение: GTA5.exe
Версия платформы: v4.0.30319
Описание. Процесс был завершен из-за необработанного исключения.
Сведения об исключении: System.AccessViolationException
   в nativeCall()
   в GTA.Native.NativeTask.Run()
   в GTA.ScriptDomain.DoTick()
   в GTA.ScriptDomain.DoTick()
   в <Module>.ManagedTick()

Вот тут вызывается сам nativeCall

private ref struct NativeTask : IScriptTask
{
    ScriptDomain a;
    virtual void Run()
    {
        try {
            nativeInit(_hash);
            for each (auto argument in _arguments)
            {
                nativePush64(argument->_data);
            }
            _result = nativeCall();
        }
        catch (AccessViolationException ^ex) {
            a.LogStatic("[Exception]", String::Concat("ScriptDomain DoTick: ", ex));
        }
    }
    UInt64 _hash, *_result;
    array<InputArgument ^> ^_arguments;
};

Вызывается где-то тут

void ScriptDomain::DoTick()
{
    try {
        // Execute scripts
        for each (Script ^script in _runningScripts)
        {
            if (!script->_running)
            {
                continue;
            }
            _executingScript = script;
            while ((script->_running = SignalAndWait(script->_continueEvent, script->_waitEvent, 30000)) && _taskQueue->Count > 0)
            {
                _taskQueue->Dequeue()->Run();
            }
            _executingScript = nullptr;
            if (!script->_running)
            {
                Log("[ERROR]", "Script '", script->Name, "' is not responding! Aborting ...");
                AbortScript(script);
                continue;
            }
        }
        // Clean up pinned strings
        CleanupStrings();
    }
    catch (AccessViolationException ^ex) {
        Log("[Exception]", "ScriptDomain DoTick: " + ex);
    }
}

Тупо крашит и никаких исключений не выдает.

Для ясности, использую это: https://github.com/crosire/scripthookvdotnet/tree/dev_v2

Answer 1

В .NET 4.0 по умолчанию нельзя поймать некоторые виды исключений, так вызываемые Corrupted State Exceptions. Но можно разрешить конкретному методу ловить такие исключения, поставив на него атрибут [HandleProcessCorruptedStateExceptions]

[HandleProcessCorruptedStateExceptions]
virtual void Run()
{
...
}

Обратите внимание, что рантайм при это пропустит выполнение finally-блоков (включая неявные finally в using), в методах, на которых этот атрибут не стоит:

If a suitable catch clause is found, the CLR will unwind the stack as normal but will only execute finally and fault blocks (and in C#, the implicit finally block of a using statement) in functions marked with the attribute.

Альтернативное решение, если код поменять не получается по каким-либо причинам - собрать ваш exe / dll под 3.5, и при запуске под 4.0 добавить в конфиге

<legacyCorruptedStateExceptionsPolicy enabled="true"/>

Подробное описание механизма и особенностей разных версий: CLR Inside Out - Handling Corrupted State Exceptions

READ ALSO
объеденить строчки json

объеденить строчки json

Имеется такой json:

377
Скомпонировать JSON сртроку

Скомпонировать JSON сртроку

Добрый день, есть JSON строка в которой много ошибок

252
Angular2 создать Dom вписать значения из массива

Angular2 создать Dom вписать значения из массива

Добрый день, с Angular работаю впервые, пока кажется очень сложным и непонятным, но работать приходится, возникла проблема, Необходимо создавать...

342
Интернет-магазин с Angular, хорошая ли идея? [требует правки]

Интернет-магазин с Angular, хорошая ли идея? [требует правки]

Если бы не было проблем с индексированием топовыми поисковиками сайтов, полностью рендерихщася на фронте (когда бэк отдает только json) - то этот...

540