如何使 C# 应用程序因 AccessViolationException 而崩溃
How to make C# application crash with an AccessViolationException
如何在 c# 中使用 AccessViolationException 故意使应用程序崩溃?
我有一个使用非托管 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;
}
}
这是 "native" 方式 - 虽然 @Storm 方法是 100% 确定性的。技巧是尝试写入远离当前指针的内存。 IE。即使我在我的程序中分配了 4 个字节,接下来的几千个字节仍然在为我的程序保留的内存部分。射远了,应该能拿到。
int[] array = new int[1];
fixed (int* ptr = array)
{
ptr[2000000] = 42;
}
确定性方法是让 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));
}
如何在 c# 中使用 AccessViolationException 故意使应用程序崩溃?
我有一个使用非托管 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;
}
}
这是 "native" 方式 - 虽然 @Storm 方法是 100% 确定性的。技巧是尝试写入远离当前指针的内存。 IE。即使我在我的程序中分配了 4 个字节,接下来的几千个字节仍然在为我的程序保留的内存部分。射远了,应该能拿到。
int[] array = new int[1];
fixed (int* ptr = array)
{
ptr[2000000] = 42;
}
确定性方法是让 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));
}