如何使C#应用程序崩溃

时间:2013-08-01 14:23:07

标签: c# crash

我想测试我的应用程序崩溃转储是否可以调试,所以我需要首先生成我的应用程序的崩溃转储,但我用C#编写它,所以任何人都知道如何触发崩溃。(事实上我测试了很多例外,不安全的代码......,但是没有得到它)​​。谢谢----对不起,对不起,我刚刚失去了一些东西:我使用unity3d构建应用程序,它将自动处理异常,并在应用程序崩溃时为我生成崩溃转储

感谢所有人的答案,我只是在常见的c#应用程序和所有工作中测试所有方法,但不是用C#编写的unity3d应用程序,看来unity3d做得更多,我想我需要通过电子邮件发送unity3d来获得答案。如果我得到它,我会在这里发帖。

14 个答案:

答案 0 :(得分:18)

以下内容将提供未处理的异常,并要求您选择调试器:

System.Diagnostics.Debugger.Launch()

答案 1 :(得分:11)

StackOverflowException是一个坏蛋:

void PerformOverflow()
{
  PerformOverflow();
}

用法:

PerformOverflow();

答案 2 :(得分:9)

抛出异常:)

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

答案 3 :(得分:5)

一种可靠的方法如下:

ThreadPool.QueueUserWorkItem(new WaitCallback(ignored => 
{
   throw new Exception();
}));

所有其他人都可以通过顶级ApplicationDomain.OnUnhandledException等处理。

这个会死掉它(假设是.NET 2.0+,而不是使用'legacyUnhandledExceptionPolicy':http://msdn.microsoft.com/en-us/library/ms228965.aspx)。

答案 4 :(得分:5)

好。实际崩溃CLR唯一的好方法是在管理世界中注入原生异常。

直接调用Kernel32.dll的RaiseException()会立即崩溃任何C#应用程序和Unity Editor。

[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 Instance 1是本机调试器,并将Unity或您的C#程序用作Host程序,并从另一个Visual Studio实例附加到Host程序。

答案 5 :(得分:4)

对于 Unity3D

中的C#

UnityEngine.Diagnostics.Utils.ForceCrash(在Unity 2018.3中)

这可以与以下ForcedCrashCategory枚举参数之一一起使用:

  

AccessViolation

     

通过执行无效的内存导致崩溃   访问。无效的内存访问在每个平台上执行为   如下:

     

FatalError

     

使用Unity的本机致命错误导致崩溃   实施。

     

中止

     

通过调用abort()函数导致崩溃。

     

PureVirtualFunction

     

通过调用纯虚函数导致崩溃   引发异常。


对于Unity的较旧版本

UnityEngine.Application.ForceCrash(int mode)

对于更旧的版本(Unity 5):

UnityEngine.Application.CommitSuicide(int mode)

根据我的经验,模式0导致“统一处理”崩溃(出现Unity崩溃对话框),模式2导致“硬”崩溃,出现Windows错误对话框。

这似乎与mode上的this post by Smilediver一致:

  

0-将模拟崩溃,1-将模拟致命错误,Unity   已经抓到2-会调用abort()。

(未记录这些方法,因为它们仅供Unity内部使用。根据您的Unity版本,它们也可能标记为[Obsolete]。)

答案 6 :(得分:1)

没有一个答案按照我要求的方式崩溃了我的应用程序。所以这是适合我的方法。

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

答案 7 :(得分:0)

public Object crashMe()
{
    return null;
}

// call me!
crashMe().ToString();

不应该只创建一个简单的NullPointer并使你的应用程序崩溃吗?

答案 8 :(得分:0)

 int[] x = {0};
 int blah = x[2];

也会引起异常

答案 9 :(得分:0)

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

答案 10 :(得分:0)

如果您尝试转换空游戏对象,则复制起来很容易。例如,像这样:

public static GameObject gameObjectCrash;
public void GenerateCrash()
{
    gameObjectCrash.transform.rotation = Quaternion.Euler(90, 0, 0);
}

答案 11 :(得分:0)

另一种选择是致电

System.Environment.FailFast("Error happened")

答案 12 :(得分:0)

我认为早期的统一版本中有一个代码,比如

Application.commitSuicide(number Input); 

现在被替换为

Application.ForceCrash(number input); 

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

Application.ForceCrash(1); 

完成工作。

答案 13 :(得分:-2)

使用以下代码关闭应用程序。

Environment.Exit(1);    

Exit需要一个名为exitcode的参数。如果exitcode = 0则表示没有错误。提供非零退出代码以反映错误。