【问题标题】:C# - Application terminates unexpectedly without leaving tracesC# - 应用程序意外终止而不留下痕迹
【发布时间】:2013-09-11 20:24:57
【问题描述】:

我有一个使用 SFML.Net 的简单 C# 应用程序/游戏,当前在执行后 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();
    }
}

【问题讨论】:

  • Game.Run() 上添加一个断点并进入它。它是“正确的”运行方法吗?调用 Environment.Exit 的不正确/陈旧的 Run 方法可能会终止进程而无异常。

标签: c# .net debugging visual-studio-debugging sfml


【解决方案1】:

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

对于那些不知道的人,启用非托管调试: 项目 > 属性 > 调试 > 选择“启用非托管代码调试”

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我的猜测是:

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

        1. 你怎么知道第一行永远没有到达?断点?输出?
        2. 当您希望输入此函数时会发生什么?您的应用程序存在吗?
        3. 你在一步步调试吗?

        【讨论】:

          猜你喜欢
          • 2020-03-04
          • 2021-06-24
          • 2011-01-31
          • 2011-09-27
          • 2013-09-07
          • 2011-09-09
          • 1970-01-01
          • 2020-10-31
          • 1970-01-01
          相关资源
          最近更新 更多