我正在一个相当大的 .NET 应用程序中调试一个讨厌的 AccessViolationException
(它会关闭整个进程,只留下一个事件查看器条目)。该应用程序中发生了很多分散注意力的事情,这使得根本原因分析变得非常困难。我想要一个“玩具问题”版本,但(充其量)对 C++ 生疏,我很难创建一个因此类异常而死的 .NET 应用程序。
我搜索并找到了例如 this somewhat old post显示应该抛出我想要的异常的代码。但是如果我编译这个:
static unsafe void Main(string[] args)
{
Console.WriteLine("Doing stuff");
try
{
int foo = (*((int*)0));
}
catch (AccessViolationException)
{
Console.WriteLine("Don't want to reach this.");
}
Console.WriteLine("Waiting");
Console.ReadKey();
}
或者这个:
static unsafe void Main(string[] args)
{
Console.WriteLine("Doing stuff");
try
{
int foo;
int* ip = null;
foo = *ip; //crash!
}
catch (AccessViolationException)
{
Console.WriteLine("Don't want to reach this.");
}
Console.WriteLine("Waiting");
Console.ReadKey();
}
附言。 catch
block 在那里是因为我试图表示的实际场景是我也无法捕获异常的场景(所以我不能只是throw
我自己)。
启用“允许不安全代码”选项后,在新的 .NET 控制台应用程序中,它会因 空引用异常 而崩溃,而不是 AccessViolationException
。虽然我并不太惊讶,并且有点理解为什么会这样,但我仍然遇到了最初的问题。
底线::是否有一种简单的方法可以创建按需导致 AccessViolationException
的 .NET 应用程序,最好是在没有异常处理选项,只在事件查看器中留下痕迹?
最佳答案
将 0
(或 null
)替换为 -1
— 它应该触发所需的行为,因为 -1 ,当隐式转换为指针时,结果为 0xFFFFFFFF…,它通常属于您不允许从用户模式程序读取的内核模式地址空间(在 Windows 和 *nix 中)。
关于c# - 在 .NET 应用程序中显式导致 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41358192/