我有一个简单的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();
}
}
答案 0 :(得分:1)
我的猜测是:
Access Violation Exception
cannot be caught。 OR
Run
方法之前,还有一些其他异常。为了验证这一点,请确保您的调试器stops on first chance exceptions。如果您指定:
,也会有所帮助答案 1 :(得分:1)
我的猜测是异常是由另一个线程引发的。您无法捕获主线程中另一个线程抛出的异常。所以你在catch中的断点永远不会被击中。顺便说一句,你是否尝试在UnhandledExceptionEventHandler方法中使用断点OnUnhandledException?这就是所有未处理的例外情况!希望这会有所帮助。
答案 2 :(得分:1)
您可以使用Runtime Flow工具(由我开发的30天试用版)获取应用程序中所有被调用的函数堆栈,直到终止点,并找到实际发生的情况。
答案 3 :(得分:1)
对于那些不知道的人,启用非托管调试: 项目> 属性> 调试>选择“启用非托管代码调试”