如何通过AccessViolationException

时间:2019-05-30 21:14:19

标签: c# access-violation

如何在C#中使用AccessViolationException故意使应用程序崩溃?

我有一个使用非托管DLL的控制台应用程序,该DLL最终由于访问冲突异常而崩溃。因此,我需要故意抛出一个AccessViolationException,以测试它在某些情况下的行为。

除此之外,它必须特别是AccessViolationException,因为catch块不会处理此异常。

令人惊讶的是,这不起作用:

public static void Crash()
{
    throw new AccessViolationException();
}

都不是:

public static unsafe void Crash()
{
    for (int i = 1; true; i++)
    {
        var ptr = (int*)i;
        int value = *ptr;
    }
}

2 个答案:

答案 0 :(得分:3)

确定性方法是让Windows为您抛弃它:

从ПетърПетров的答案到:How to make C# application crash

[DllImport("kernel32.dll")]
static extern void RaiseException(uint dwExceptionCode, uint dwExceptionFlags,  uint nNumberOfArguments, IntPtr lpArguments);

void start()
{
    RaiseException(0xC0000005, 0, 0, new IntPtr(1));
}

答案 1 :(得分:2)

这是“本机”方式-尽管@Storm方法是100%确定性的。技巧是尝试写入远离当前指针的内存。即即使我在程序中分配了4个字节,接下来的几千个字节仍在为程序保留的内存部分内。射击很远,你应该得到它。

int[] array = new int[1];
fixed (int* ptr = array)
{
      ptr[2000000] = 42;
}