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();
}
}
我的猜测是:
- 你得到的是一个无法抓住的
Access Violation Exception
。
或
- 在进入未处理的
Run
方法之前,还有其他一些异常。为了验证这一点,请确保调试器在第一次出现异常时停止。
如果您指定以下内容,也会有所帮助:
- 你怎么知道第一行永远不会到达?断点?输出?
- 当您期望输入此功能时会发生什么? 您的应用程序是否存在?
- 您是否正在逐步调试?
我的猜测是异常是由另一个线程抛出的。您无法捕获从主线程中的另一个线程引发的异常。因此,您的捕获断点永远不会被击中。顺便说一句,您是否尝试过在UnhandledExceptionEventHandler方法OnUnhandledException中使用断点?这就是所有未处理的异常的去向!希望这有帮助。
您可以使用运行时流工具(30 天试用版,由我开发)获取应用程序中的所有调用函数堆栈,直到终止点,并查找实际发生的情况。
几个月
后我又回到了这个问题,意识到我的错误是多么愚蠢。显然,默认情况下未启用非托管代码调试(这是我第一次使用VS2012),并且此异常是从SFML的基本C++库中引发的。
对于那些不知道的人,要启用非托管调试,请执行以下操作:项目>属性> 调试> 选择"启用非托管代码调试"