c# - 在 .NET 应用程序中显式导致 AccessViolationException

标签 c# .net

我正在一个相当大的 .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/

相关文章:

c# - 如何在 C# 中进行只进、只读的 WMI 查询?

c# - ASP.NET Core MVC - 无法返回带有 View 的模型

c# - 取消订阅 Lambda 事件处理程序 **关闭**

c# - IE8强制清除缓存

c# - 优化具有大量实例的 .NET 应用程序的内存占用

c# - CopyToDataTable : Why exactly does it throw an error if one field is NULL, 以及如何修复它?

c# - 不确定如何修复这个奇怪的 Entity Framework (关系/导航)错误

C# 字符数组 - 分配、更改、显示

c# - 继承基类时,C#是否默认为new而不是override是有原因的吗?

c# - 如何将Active控件转换为文本框类型?