5

BSODon が ping の途中でデバッグを終了するというバグに遭遇しています。

(wpf)アプリケーション(継続的にpingを実行する場所)で無効にする方法がいくつかありますが、そうするのを忘れてBSODになることがあります。

グローバルな AllowRealPinging 変数を変更し、デバッガーを終了する前にコールバックで 2 秒間スリープして、BSOD にならないようにすることで、この問題を回避したいと思います。

4

2 に答える 2

13

これは Windows 7 の既知のバグです。プロセスを終了すると、バグ チェック コード 0x76、PROCESS_HAS_LOCKED_PAGES の tcpip.sys で BSOD が発生します。最も関連性の高いフィードバック記事はこちらです。この SO questionにも記載されています。そこには素晴らしい答えはありません。既知の唯一の回避策は、4.0 より前の .NET バージョンにフォールバックすることです。これは、ドライバーのバグをトリガーしない別の winapi 関数を使用します。

デバッグ中は ping を実行しないことが、この問題を回避する最善の方法です。希望するアプローチは機能しません。ブレークポイントに到達するとプログラムは完全にフリーズし、デバッグを停止すると kaboom になります。

最も簡単な方法は、デバッガーが接続されているという特定のケースで、最初から ping を開始しないことです。System.Diagnostic.Debugger.IsAttached プロパティを使用して、コード内でこれを検出します。

于 2013-07-26T18:19:17.587 に答える
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;

        }

私は同じ問題を抱えていました、これはそれを解決します!

于 2017-07-31T07:29:38.210 に答える