我正在AccessViolationException一个相当大的.NET应用程序中调试一个讨厌的东西(一个取消整个过程,只留下一个事件查看器条目).该应用程序中存在许多令人分心的事情,使根本原因分析变得非常困难.我想有一个"玩具问题"版本,但在(最好)生锈的C++,我很难创建一个死于这种异常的.NET应用程序.
我已经搜索并找到了这个有点老的帖子,它显示了应该抛出我想要的异常的代码.但如果我编译这个:
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();
}
Run Code Online (Sandbox Code Playgroud)
或这个:
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();
}
Run Code Online (Sandbox Code Playgroud)
PS.该catch块是那里,因为我的实际我想代表的情况是,我不能捕获的异常或者(这样我就可以不只是throw我自己).
使用"允许不安全代码"选项,在新的.NET控制台应用程序中,它崩溃时出现Null Reference Exception,而不是AccessViolationException.虽然我并不是太惊讶,并且有点理解为什么会这样,但我仍然留下原始问题.
底线:是否有一种简单的方法来创建一个导致AccessViolationException按需的.NET应用程序,最好是在没有异常处理选项的情况下进程完全死亡,只在事件查看器中留下痕迹?
替换0(或 null) -1 - 它应该触发所需的行为,因为-1,当隐式转换为指针时,导致 0xFFFFFFFF ...通常属于内核模式地址空间(在Windows和*nix中),你不允许从用户模式程序中读取.