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

时间:2013-09-08 02:12:59

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

我有一个简单的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();
    }
}

4 个答案:

答案 0 :(得分:1)

我的猜测是:

OR

如果您指定:

,也会有所帮助
  1. 你怎么知道第一行永远不会到达?断点?输出?
  2. 当您希望输入此功能时会发生什么?你的申请是否存在?
  3. 您是否正在逐步调试?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

几个月后我回到了这里,并意识到我的错误是多么愚蠢。显然默认情况下没有启用非托管代码调试(这是我第一次使用VS2012),并且这个异常是从SFML的基本C ++库中抛出的。

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