Как смоделировать исключение поврежденного состояния в .NET 4?

Что ж, в .NET 4 Microsoft добавила атрибут HandleProcessCorruptedStateExceptions:

Класс HandleProcessCorruptedStateExceptionsAttribute

Я хочу протестировать эту функцию. Как мне довести свое приложение до «коррумпированного» состояния?


person Community    schedule 01.06.2010    source источник
comment
Допустим, вы поймали это. что ты собираешься с этим делать?   -  person    schedule 01.06.2010
comment
Зарегистрируйте это. У нас сбой производства без каких-либо журналов. Этот новый журнал поможет нам.   -  person    schedule 01.06.2010


Ответы (3)


Испортить кучу собранного мусора - всегда хороший способ:

using System;
using System.Runtime.InteropServices;


class Program {
  unsafe static void Main(string[] args) {
    var obj = new byte[1];
    var pin = GCHandle.Alloc(obj, GCHandleType.Pinned);
    byte* p = (byte*)pin.AddrOfPinnedObject();
    for (int ix = 0; ix < 256; ++ix) *p-- = 0;
    GC.Collect();   // kaboom
  }
}
person Hans Passant    schedule 01.06.2010

Просто разыменуйте случайное число:

    private static unsafe void AccessViolation()
    {
        byte b = *(byte*) (8762765876);
    }

или переполнить стек:

    private static void StackOverflow()
    {
        StackOverflow();
    }
person Roman Starkov    schedule 01.09.2010
comment
Согласно Microsoft, StackOverflowException не является CSE (исключение поврежденного состояния) и не может быть обнаружено как единое целое: dotnetslackers.com/articles/net/ - person Abel; 29.11.2013

Проверить HandleProcessCorruptedStateExceptions функцию:

using System.Diagnostics;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
...

[HandleProcessCorruptedStateExceptions]
public void HandleCorruptedStateException()
{
    try
    {
        var ptr = new IntPtr(42);
        Marshal.StructureToPtr(42, ptr, true);
    }
    catch(Exception ex)
    {
         Debug.WriteLine(ex.Message);
    }
}
person Andrei Krasutski    schedule 06.08.2018