Приложение: 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
В .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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый день, с Angular работаю впервые, пока кажется очень сложным и непонятным, но работать приходится, возникла проблема, Необходимо создавать...
Если бы не было проблем с индексированием топовыми поисковиками сайтов, полностью рендерихщася на фронте (когда бэк отдает только json) - то этот...