使用Ping时的蓝屏

时间:2013-07-19 23:06:47

标签: c# visual-studio debugging callback bsod

我遇到了一个错误,它在BSODon ping中间结束调试。

我有几种方法可以在我的(wpf)应用程序中禁用它(我连续ping通),但有时我会忘记这样做和BSOD。

我想通过更改全局AllowRealPinging变量并在退出调试器之前在回调中休眠2秒来解决这个问题,所以我不会BSOD。

2 个答案:

答案 0 :(得分:11)

这是Windows 7中的已知错误,当​​您终止进程时,您将在tcpip.sys中获得带有错误检查代码0x76,PROCESS_HAS_LOCKED_PAGES的BSOD。最相关的反馈文章is herethis SO question中也有介绍。没有很好的答案,唯一已知的解决方法是回退到早于4.0的.NET版本,它使用另一个不会触发驱动程序错误的winapi函数。

调试时避免ping是肯定是避免此问题的最佳方法。你想要的方法不会起作用,你的程序在遇到断点时会被完全冻结,当你停止调试时就会被冻结。

最简单的方法是在附加调试器的特定情况下,不首先开始ping。使用System.Diagnostic.Debugger.IsAttached属性在代码中检测它。

答案 1 :(得分:2)

这是一个很好的方法:

private void GetPing(){

            Dictionary<string, string> tempDictionary = this.tempDictionary;  //Some adresses you want to test
            StringBuilder proxy = new StringBuilder();

            string roundTripTest = "";
            string location;
            int count = 0;  //Count is mainly there in case you don't get anything

            Process process = new Process{

                StartInfo = new ProcessStartInfo{
                    FileName = "ping.exe",
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    CreateNoWindow = true,

                }

            };

            for (int i = 0; i < tempDictionary.Count; i++){

                proxy.Append(tempDictionary.Keys.ElementAt(i));

                process.StartInfo.Arguments = proxy.ToString();

                do{
                    try{

                        roundTripTest = RoundTripCheck(process);

                    }
                    catch (Exception ex){

                        count++;

                    }

                    if (roundTripTest == null){

                        count++;

                    }

                    if (count == 10 || roundTripTest.Trim().Equals("")){

                        roundTripTest = "Server Unavailable";

                    }

                } while (roundTripTest == null || roundTripTest.Equals(" ") || roundTripTest.Equals(""));
            }

            process.Dispose();

        }

RoundTripCheck方法,魔术发生的地方:

       private string RoundTripCheck(Process p){


            StringBuilder result = new StringBuilder();
            string returned = "";

            p.Start();

            while (!p.StandardOutput.EndOfStream){

                result.Append(p.StandardOutput.ReadLine());

                if (result.ToString().Contains("Average")){

                    returned = result.ToString().Substring(result.ToString().IndexOf("Average ="))
                                     .Replace("Average =", "").Trim().Replace("ms", "").ToString();
                    break;
                }


                result.Clear();

            }

            return returned;

        }

我有同样的问题,这解决了!