在升级到.NET 4.0后,Debugger.Launch()现在导致我的Windows服务崩溃了。

6

针对调试环境,我们在代码中加入了一个条件语句Debugger.Launch,以允许开发人员调试Windows服务的启动代码。今天我们刚升级到.NET 4.0。自从升级后,如果我们退出JIT窗口(即选择不进行调试),Windows服务就会崩溃(进程终止)。以前它只是恢复正常。如果我们接受附加,应用程序就不会终止,并且可以正常工作。

编辑

另一个奇怪的事情是,抛出的异常不再是Launch for User异常。现在它是一个未处理的Microsoft .NET框架异常。我尝试使用try catch包装它以查看结果,但在进行调试时无法捕获异常,因为此时异常不会发生。如果我尝试将异常记录到文件中,则服务会崩溃并且没有任何结果。

有什么方法可以解决这个问题吗?有什么原因导致这种情况发生吗?

更多信息

我刚创建了一个空白的新Windows表单应用程序。


        public Form1()
        {
            try
            {
                MessageBox.Show("hello");
                System.Diagnostics.Debugger.Launch();

            }
            catch
            {
                MessageBox.Show("error");
            }
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            InitializeComponent();
        }

        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            MessageBox.Show(e.ToString());
        }

我先收到了第一个“hello”。然后我得到了JIT窗口,上面显示出“发生了未处理的Microsoft .NET异常”。如果我不附加它,它就会崩溃,没有任何消息或者其他提示。
我尝试了WinDbg和其他工具。我对这些工具并不熟悉。以下是我得到的内容。看起来并没有什么用处。
Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
Loading Dump File [C:\Users\moueis\TestDebugging_100927_104956.dmp] User Mini Dump File with Full Memory: Only application data is available Comment: ' *** C:\Users\moueis\Desktop\procdump.exe TestDebugging.exe -e -ma *** Unhandled exception' Symbol search path is: *** Invalid *** **************************************************************************** * Symbol loading may be unreliable without a symbol search path. * * Use .symfix to have the debugger choose a symbol path. * * After setting your symbol path, use .reload to refresh symbol locations. * **************************************************************************** Executable search path is: Windows 7 Version 7600 MP (8 procs) Free x64 Product: Server, suite: TerminalServer SingleUserTS Machine Name: Debug session time: Mon Sep 27 10:49:56.000 2010 (UTC - 4:00) System Uptime: 11 days 20:41:04.714 Process Uptime: 0 days 0:00:22.000 ......................................... *** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - *** ERROR: Symbol file could not be found. Defaulted to export symbols for KERNELBASE.dll - KERNELBASE!DebugBreak+0x2: 000007fe`fd432442 cc int 3
这种情况在不止一台机器上发生了(尽管它们非常相似)。
再次提供更多信息:
显然很容易重现。在使用.NET 4.0的.NET窗体中使用上述代码片段,该问题已在内部多个系统上发生,并且我已收到来自外部方面的确认,该问题可以简单地通过使用上述代码片段在.NET窗体中使用.NET 4.0来重现。

1
发布异常的堆栈跟踪以及异常消息。 - Hans Passant
事件日志告诉你什么? - Dirk Vollmar
你可以使用Sysinternal的ProcDump实用程序(使用-e选项)对服务进行内存转储,以便在其崩溃时获取转储。获取转储后,您可以将其加载到WinDbg中,并使用SOS调试器扩展来调查其崩溃原因。 - Liran
你能把你的转储文件上传到某个地方吗? - Dirk Vollmar
我没有一个方便的地方来发布转储文件(我不相信你能在这里发布)。然而,问题很容易重现。 - Mark
看起来是CLR 4.0中的一个bug。我已经测试了你的代码示例并遇到了同样的问题。如果我将目标框架更改为3.5,在拒绝JIT调试器消息后,应用程序会正常继续运行,如预期所示。 - Richard Anthony Freeman-Hein
1个回答

1

是的,我已经发布了 :) 目前还没有修复它的方法。 - Mark
我想你可能已经有了。我认为即使你有,其他人发现这个问题可能会喜欢这个链接。 - Redwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接