如何使C#应用程序崩溃

11
我想测试一下我的应用程序的崩溃转储是否可以进行调试。但首先,我需要生成一个应用程序的崩溃转储文件。我使用C#编写我的应用程序,并尝试了很多异常和不安全代码等,但是没有成功。
谢谢!
编辑:抱歉,我忘了一些东西,我正在使用Unity3D制作应用程序,它会自动处理异常。
编辑2:感谢大家的回答。我在标准的C#应用程序中测试了你们的建议,都可以正常工作,但是在我使用C#编写的Unity3D应用程序中无法实现。似乎Unity3D需要更多的努力来引起崩溃,我可能会给Unity3D发送电子邮件询问一个答案。如果有答案,我会在这里发布。谢谢!

15
恭喜,您似乎是最专业的程序员! - WarrenFaith
2
对象 obj = null; obj.ToString(); - kostas ch.
4
强制抛出异常。 - Microsoft DN
7
部分拆下主板上的DIMM? - Keith Payne
2
也许这会有所帮助:https://dev59.com/kHNA5IYBdhLWcg3wAItP - Moo-Juice
显示剩余6条评论
14个回答

23
以下内容将会出现未处理的异常并要求选择调试器:
System.Diagnostics.Debugger.Launch()

1
虽然问题有点傻,但这个答案绝对相反,+1。 - Ibrahim Najjar
抱歉,我尝试了,但是出现了“NotImplementedException:未实现请求的功能”的错误。 - fieldChao
1
由于您说您正在使用Unity3D进行开发,这可能不是一个选项,抱歉... - Giannis Paraskevopoulos

17

StackOverflowException 是个糟糕的例外:

void PerformOverflow()
{
  PerformOverflow();
}

使用方法:

PerformOverflow();

12

抛出一个异常 :)

throw new Exception("Your exception here!");

抱歉,我已经尝试抛出异常,但这并没有导致我的应用程序崩溃。 - fieldChao
1
抱歉,我丢失了一些东西:我使用Unity3d,并且它处理所有的异常,只需在输出文件中显示异常即可。谢谢。 - fieldChao
1
这不是崩溃。崩溃只能发生在崩溃的本地代码,或调用RaiseException Win32 API的情况下。 - Петър Петров

11
在Unity3D中使用C#,可以使用以下方法之一来引发崩溃:UnityEngine.Diagnostics.Utils.ForceCrash (适用于Unity 2018.3)。这个方法需要一个ForcedCrashCategory枚举参数,包括以下四种类型:
- AccessViolation:通过执行无效的内存访问来引发崩溃。在每个平台上,都会执行无效的内存访问。 - FatalError:使用Unity的本机致命错误实现来引发崩溃。 - Abort:通过调用abort()函数来引发崩溃。 - PureVirtualFunction:通过调用纯虚函数来引发崩溃以引发异常。
对于旧版本的Unity,可以使用UnityEngine.Application.ForceCrash(int mode)方法。对于Unity 5及更早版本,可以使用UnityEngine.Application.CommitSuicide(int mode)方法。根据我的经验,mode 0会导致“Unity处理”的崩溃(出现Unity崩溃对话框),而mode 2会导致“硬”崩溃(出现Windows错误对话框)。根据Smilediver在mode上的这篇帖子,这似乎是一致的:0-模拟崩溃,1-模拟Unity捕获的致命错误,2-调用abort()。需要注意的是,这些方法并没有被文档化,因为它们是为Unity内部使用而设计的。根据您的Unity版本,它们也可能被标记为[Obsolete]。

8

唯一一个真正让CLR崩溃的方法是向托管环境注入一个本机异常。

直接调用Kernel32.dll的RaiseException()会立即使任何C#应用程序以及Unity编辑器崩溃。

[DllImport("kernel32.dll")]
static extern void RaiseException(uint dwExceptionCode, uint dwExceptionFlags,  uint nNumberOfArguments, IntPtr lpArguments);

void start()
{
    RaiseException(13, 0, 0, new IntPtr(1));
}

愉快地崩溃吧。请注意,为了调试本地托管代码,您需要同时运行两个Visual Studio实例。如果您正在开发本地P/INVOKE插件,请设置Visual Studio实例1为本地调试器,并将Unity或您的C#程序设置为主机程序,然后从另一个Visual Studio实例附加到主机程序。


你不需要大声喊叫来强调东西。使用斜体或粗体更好...只是说因为看到你甚至在评论中都在尖叫很烦人... - WarrenFaith
2
这就像一个老习惯,就像你总是使用法律术语来突出重点和重要的句子一样,你使用大写锁定键... - Петър Петров
1
谢谢,这对我非常有效。该代码会导致Unity管理的应用程序崩溃。 - Andreas Grech

7

另一个选项是调用

System.Environment.FailFast("Error happened")

已经工作并且具有系统库提供的预期方法的优点。 - Tomáš Zato
测试崩溃ASP.NET Core应用程序也很有效(大多数评分较高的选项似乎都无法解决问题)-谢谢! - olucafont6
1
这将把异常详细信息放入事件日志中,可能通过Windows错误报告(WER)向Microsoft报告。也许是需要的,也许不是。 - l33t

6
一种可靠的方法如下所示:
ThreadPool.QueueUserWorkItem(new WaitCallback(ignored => 
{
   throw new Exception();
}));

其他所有问题都可以由顶级ApplicationDomain.OnUnhandledException等处理。

这个问题将会彻底解决(假设使用.NET 2.0+,并且不使用“legacyUnhandledExceptionPolicy”:http://msdn.microsoft.com/en-us/library/ms228965.aspx)。


似乎Unity3D应用程序会直接忽略异常(不像其他应用程序一样处理它),并且没有任何反馈。 - fieldChao
如果你想要更少的代码... ThreadPool.QueueUserWorkItem(ignored => throw new Exception()); - TravisWhidden
1
甚至更少的 ThreadPool.QueueUserWorkItem(_ => throw new Exception()); - Vlad
请注意,只要使用UnityEngineApplication.logMessageReceivedThreaded(而不是logMessageReceived),Unity3d就会记录此异常。 - sonnyb

0

没有一个答案能够像我期望的那样使我的应用程序崩溃。所以这里是适合我的方法。

    private void Form1_Load(object sender, EventArgs e)
    {
        object p = 0;
        IntPtr pnt = (IntPtr)0x123456789;
        Marshal.StructureToPtr(p, pnt, false);
    }

1
使用此方法不保证不会崩溃。 - Петър Петров

0
  public void Loop()
  {
      Loop();
  }
  //call this
  Loop();

0

我认为早期Unity版本中有一个类似的代码

Application.commitSuicide(number Input); 

现在它被替换为

Application.ForceCrash(number input); 

到目前为止,我不知道数字输入中的不同数字有什么作用,但对于我来说,

Application.ForceCrash(1); 

完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接