Как да симулирам изключение на повредено състояние в .NET 4?

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

HandleProcessCorruptedStateExceptionsAttribute Class

Искам да тествам тази функция. Как мога да доведа приложението си до „повредено състояние“?


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 (Corrupted State Exception) и не може да бъде уловен като такъв: 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