【问题标题】:C# program causes bluescreen?C#程序导致蓝屏?
【发布时间】:2011-11-02 04:23:33
【问题描述】:

这只是蓝屏显示的重要内容。我在 Windows 7 x64 上。

“检测到问题并关闭 Windows 以防止损坏 到您的计算机。

PROCESS_HAS_LOCKED_PAGES

* 停止:0x00000076 (0x0000000000000000, 0xfffffa8009dcd060, 0x0000000000000011, 0x0000000000000000)"

我现在无法处理它,因为每次关闭它都会出现蓝屏! 除了运行下面的后台工作程序之外,该程序还没有做任何事情。它会 ping 所有可能属于用户家庭网络的地址,并尝试连接到另一个程序将侦听的某个端口。

private void NetworkScanner_DoWork(object sender, DoWorkEventArgs e)
    {
        bool ExceptionEncountered = false;
        int IPsProcessed = 0;

        NetworkSearcherOutput = "Starting network scanner...";
        NetworkSearcher.ReportProgress(0);
        Thread.Sleep(1000);

        foreach (IPAddress IP in Dns.GetHostAddresses(Dns.GetHostName()))
        {
            if (IP.AddressFamily == AddressFamily.InterNetwork)
            {
                string[] Octets = IP.ToString().Split('.');
                Octets[3] = "0";

                IPAddress CurrentAddressIteration = StringArrayToIP(Octets);
                while (GetLastOctet(CurrentAddressIteration) != 255)
                {
                    PingReply Reply = new Ping().Send(CurrentAddressIteration, 5);

                    if (Reply.Status == IPStatus.Success)
                    {
                        NetworkSearcherOutput = CurrentAddressIteration.ToString() + " sent response.";
                        NetworkSearcher.ReportProgress(0);
                        Thread.Sleep(500);

                        InClient Client = new InClient(CurrentAddressIteration);

                        try
                        {
                            Client.Connect();

                            SnapshotBox.Image = Client.Receive(typeof(Image));

                            NetworkSearcherOutput = CurrentAddressIteration.ToString() + " is running program.";
                            NetworkSearcher.ReportProgress(0);
                            Thread.Sleep(1000);
                        }

                        catch (Exception E)
                        {
                            // A socket exception is expected when the client is not running the program.
                            if (E is SocketException)
                            {
                                Client.Close();

                                NetworkSearcherOutput = CurrentAddressIteration.ToString() + " is not running program.";
                                NetworkSearcher.ReportProgress(0);
                                Thread.Sleep(1000);
                            }

                            //Unhandled exception. Show messagebox and close.
                            else
                            {
                                MessageBox.Show("Network scanner encountered an unhandled exception.\n\n" + E.GetType().ToString() + ": " + E.Message, "Unhandled Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                ExceptionEncountered = true;
                                break;
                            }
                        }
                    }

                    else
                    {
                        NetworkSearcherOutput = CurrentAddressIteration.ToString() + " did not respond.";
                        NetworkSearcher.ReportProgress(0);
                    }

                    IPsProcessed++;

                    if (IPsProcessed == 5)
                    {
                        NetworkSearcher.ReportProgress(2);
                        IPsProcessed = 0;
                    }

                    Octets = CurrentAddressIteration.ToString().Split('.');
                    Octets[3] = (Int32.Parse(Octets[3]) + 1).ToString();
                    CurrentAddressIteration = StringArrayToIP(Octets);
                }
            }
        }

        if (!ExceptionEncountered)
        {
            NetworkSearcherOutput = "Network scanning complete.";
            NetworkSearcher.ReportProgress(0);
            NetworkSearcher.ReportProgress(100);
        }

        else
        {
            NetworkSearcherOutput = "Network scanning encountered an error.";
            NetworkSearcher.ReportProgress(-1);
        }

我认为 C# 程序应该永远不会导致蓝屏?

【问题讨论】:

  • 您不应该直接导致蓝屏。但是如果来自微软的底层代码有一个错误,它可能会导致它
  • 没有“应该”创建蓝屏的程序...
  • support.microsoft.com/kb/256010 暗示这与驱动程序行为不当有关,可能是基于您的程序的网络驱动程序。此 KB 指示指示哪个驱动程序可能有故障的方法;它与您的托管代码无关。
  • 不,用户模式代码不会导致蓝屏,即使它来自 Microsoft。您是否正在运行任何 VPN 软件或安全软件?
  • @Andrew,我想你会发现 ping'o'death 应该会导致蓝屏死机,但不可否认,这是一个特例 :-) 在任何情况下案例,如果(像我一样)你有一个 A 类家庭网络怎么办? :-)

标签: c# sockets thread-safety


【解决方案1】:

几周前我发现了这个问题。仅在使用 .NET 4 时才会发生。

报告于MS Connect

编辑:

(Will*)将此链接添加到 MS Connect 错误报告。

*login.live.com 再次进入无限循环...

【讨论】:

  • 我只是想验证是的,它​​只发生在 .NET 4 中。我切换了框架并且不再发生崩溃。但是,我在另一台使用 VS 2010 的 PC 上测试了导致 BSOD 的程序,但什么也没发生……Someone give it a try.
【解决方案2】:

需要明确的是,“用户”模式代码无法在 Windows 中强制创建蓝屏,除非它使用未记录的 API 或强制将不良数据输入驱动程序。您的 C# 代码在这里可能没有错,就好像您使用用户模式类 (Socket) 一样,套接字负责不使您的计算机崩溃。

正如@Joe 所评论的Microsoft Support KB Article 256010 清楚地描述了这个停止消息,但更好的是有关于捕获导致此错误的驱动程序名称的明确说明。

请注意,您安装的任何软件防火墙也涉及内核模式级别,因此也可能导致此错误。我建议您遵循知识库文章的建议并尝试找出问题所在。但您也可以确保已将网络驱动程序和防火墙/VPN 软件更新到最新的稳定版本。

【讨论】:

  • 将您的代码压缩为复制品并提交给 MS Connect。您可能刚刚在 Windows 7 中发现了一个错误。
  • 也许那些比我更有智慧的人可以纠正我,但我相当确定Socket是在TcpIp.sys中实现的
  • @Spence:对不起,你不正确。这是 .NET 4 中的一个错误。并且已经报告过了。看我的回答。
  • 不,它正在生成 BSOD。因此,该错误要么在 Windows API 中,要么在从内核模式访问 API 的驱动程序中。您的 MS 连接清楚地表明该错误发生在调用 Windows DLL 之后。尽管代码在 .Net 4.0 中使用了不同的 API,但它并没有使该 API 的损坏程度降低...
  • @leppie:仅仅因为是 .NET 4 触发了这个 bug 并不意味着这个 bug 在 .NET 4 中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多