C# - 应用程序意外终止,不留下痕迹

本文关键字:痕迹 终止 应用程序 意外 | 更新日期: 2023-09-27 18:30:30

我有一个简单的 C# 应用程序/游戏 SFML.Net,它目前在执行后 1 或 2 秒内停止运行/终止,没有任何警告、异常等。请考虑以下代码:

public static void Main(string[] args)
{
   AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
   --> The following two lines are run
   Console.WriteLine("Hello");
   Console.WriteLine("Please don't go...");
   // Run the game
   try
   {
      --> This line is reached
      Game.Run();
   }
   catch (Exception e)
   {
      --> This line is never reached
      Console.WriteLine(e.Message.ToString());
   }
   --> These lines are never reached
   Console.WriteLine("Noone ever comes here, I feel so lonely... :(");
   Console.ReadKey();
   }
}

在这一点上,您可能认为 Game.Run() 方法出了问题。奇怪的是,根据VS调试器,该方法的第一行永远不会到达

public static void Run()
{
    try
    {
        --> Never reached
        LoadContent();
        // Do stuff here
        while (window.IsOpen())
        {
            // The classic game loop
        }
    }
    catch (Exception e)
    {
        --> Never reached
        Console.WriteLine(e.Message.ToString());
        Console.ReadKey();
    }
}

C# - 应用程序意外终止,不留下痕迹

我的猜测是:

  • 你得到的是一个无法抓住的Access Violation Exception

  • 在进入未处理的Run方法之前,还有其他一些异常。为了验证这一点,请确保调试器在第一次出现异常时停止。

如果您指定以下内容,也会有所帮助:

  1. 你怎么知道第一行永远不会到达?断点?输出?
  2. 当您期望输入此功能时会发生什么? 您的应用程序是否存在?
  3. 您是否正在逐步调试?

我的猜测是异常是由另一个线程抛出的。您无法捕获从主线程中的另一个线程引发的异常。因此,您的捕获断点永远不会被击中。顺便说一句,您是否尝试过在UnhandledExceptionEventHandler方法OnUnhandledException中使用断点?这就是所有未处理的异常的去向!希望这有帮助。

您可以使用运行时流工具(30 天试用版,由我开发)获取应用程序中的所有调用函数堆栈,直到终止点,并查找实际发生的情况。

几个月

后我又回到了这个问题,意识到我的错误是多么愚蠢。显然,默认情况下未启用非托管代码调试(这是我第一次使用VS2012),并且此异常是从SFML的基本C++库中引发的。

对于那些不知道的人,要启用非托管调试,请执行以下操作:项目>属性> 调试> 选择"启用非托管代码调试"