10

我想测试我的应用程序故障转储是否可以调试。但首先,我需要生成我的应用程序的故障转储。我正在使用 C# 对我的应用程序进行编码,并尝试了许多异常和不安全的代码等,但没有得到它。

谢谢!

编辑:抱歉,刚刚忘记了一些事情,我正在使用 Unity3D 制作应用程序,它会自动为我处理异常。

编辑2:感谢大家的回答。我已经在标准 C# 应用程序中测试了您的建议,一切正常,但在我的 Unity3D 应用程序(用 C# 编写)中却没有。似乎 Unity3D 需要更多的努力才能导致崩溃,我可能会通过电子邮件向 Unity3D 发送答案。如果我得到它,我会在这里发布。干杯!

4

14 回答 14

23

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

System.Diagnostics.Debugger.Launch()
于 2013-08-01T14:25:45.957 回答
16

StackOverflowException是个坏蛋:

void PerformOverflow()
{
  PerformOverflow();
}

用法:

PerformOverflow();
于 2015-06-18T11:22:23.697 回答
11

抛出异常:)

throw new Exception("Your exception here!");
于 2013-08-01T14:26:48.320 回答
8

对于Unity3D中的 C#

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

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

访问冲突

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

致命错误

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

中止

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

纯虚函数

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


对于旧版本的 Unity:

UnityEngine.Application.ForceCrash(int mode)

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

UnityEngine.Application.CommitSuicide(int mode)

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

这似乎与Smilediver 的这篇文章一致mode

0 - 将模拟崩溃,1 - 将模拟 Unity 捕获的致命错误,2 - 将调用 abort()。

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

于 2019-08-16T16:22:29.970 回答
8

出色地。实际上使 CLR 崩溃的唯一好的 100% 方法是将本机异常注入托管世界。

直接调用 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 实例附加到主机程序。

于 2016-08-22T22:12:49.803 回答
5

一个万无一失的方法如下:

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

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

这个会杀了它(假设.NET 2.0+,并且不使用'legacyUnhandledExceptionPolicy':http: //msdn.microsoft.com/en-us/library/ms228965.aspx)。

于 2013-08-02T14:16:31.177 回答
5

另一种选择是致电

System.Environment.FailFast("Error happened")
于 2019-10-16T07:52:02.903 回答
0
  public void Loop()
  {
      Loop();
  }
  //call this
  Loop();
于 2016-03-15T09:11:45.643 回答
0

你也可以除以零,

z = 0; 
int divide = 1 / x;
于 2021-08-23T20:12:06.680 回答
0

没有一个答案以我正在寻找的方式使我的应用程序崩溃。所以这是对我有用的方法。

    private void Form1_Load(object sender, EventArgs e)
    {
        object p = 0;
        IntPtr pnt = (IntPtr)0x123456789;
        Marshal.StructureToPtr(p, pnt, false);
    }
于 2016-03-15T08:48:58.440 回答
0

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

Application.commitSuicide(number Input); 

现在它被替换为

Application.ForceCrash(number input); 

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

Application.ForceCrash(1); 

做这项工作。

于 2021-05-09T16:31:07.650 回答
-1
 int[] x = {0};
 int blah = x[2];

也会导致异常

于 2013-08-01T14:28:00.020 回答
-1

如果您尝试转换空游戏对象,则很容易重现。例如,像这样:

public static GameObject gameObjectCrash;
public void GenerateCrash()
{
    gameObjectCrash.transform.rotation = Quaternion.Euler(90, 0, 0);
}
于 2019-03-07T12:59:43.113 回答
-3

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

Environment.Exit(1);    

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

于 2015-02-27T06:51:49.253 回答