2010-06-01 21 views
10

Cóż, Microsoft .NET 4 dodaje się HandleProcessCorruptedStateExceptions atrybutów:Jak zasymulować wyjątek dotyczący uszkodzonego stanu w .NET 4?

HandleProcessCorruptedStateExceptionsAttribute Class

Chcę przetestować tę funkcję. Jak mogę przenieść moją aplikację do "skorumpowanego stanu"?

+2

powiedzmy, że Złap to. Co zamierzasz z tym zrobić? – Will

+4

Zaloguj się. Mamy awarię produkcji bez żadnych dzienników. Ten nowy dziennik pomoże nam. –

Odpowiedz

13

przekręcane śmieci zbierane sterty zawsze jest dobrym sposobem:

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 
    } 
} 
+0

Działa jak urok. Dzięki. –

+0

Jesteś panem, jesteś dżentelmenem i uczonym. – Lou

13

Wystarczy dereference liczbę losową:

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

lub przepełnienie stosu:

private static void StackOverflow() 
    { 
     StackOverflow(); 
    } 
+0

+1 - znacznie prostsze niż zaakceptowana odpowiedź! – Timwi

+3

Według Microsoftu wyjątek StackOverflowException nie jest CSE (Corrupted State Exception) i nie można go złapać jako jednego: http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx# s4-corrupted-state-exceptions-cses-in-net4 – Abel