1

我有一个使用 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();
    }
}
4

4 回答 4

1

我的猜测是:

  • 你得到一个Access Violation Exception无法被抓住的东西。

或者

如果您指定:

  1. 你怎么知道第一行永远达不到?断点?输出?
  2. 当您期望输入此功能时会发生什么?你的应用程序存在吗?
  3. 你是一步步调试的吗?
于 2013-09-08T02:24:56.520 回答
1

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

于 2013-09-08T03:55:10.133 回答
1

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

于 2013-09-08T06:42:10.553 回答
1

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

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

于 2013-12-15T02:41:04.407 回答