如何在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;
}
}
答案 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;
}