我遇到了 BSODon 在 ping 中间结束调试的错误。
我有几种方法可以在我的(wpf)应用程序中禁用它(我不断地ping),但有时我忘记这样做并且蓝屏死机。
我想通过更改全局 AllowRealPinging 变量并在退出调试器之前在回调中休眠 2 秒来解决这个问题,这样我就不会蓝屏了。
我遇到了 BSODon 在 ping 中间结束调试的错误。
我有几种方法可以在我的(wpf)应用程序中禁用它(我不断地ping),但有时我忘记这样做并且蓝屏死机。
我想通过更改全局 AllowRealPinging 变量并在退出调试器之前在回调中休眠 2 秒来解决这个问题,这样我就不会蓝屏了。
这是 Windows 7 中的一个已知错误,当您终止进程时,您将在 tcpip.sys 中获得带有错误检查代码 0x76、PROCESS_HAS_LOCKED_PAGES 的 BSOD。最相关的反馈文章在这里。也涵盖在这个 SO question中。那里没有很好的答案,唯一已知的解决方法是回退到 4.0 之前的 .NET 版本,它使用另一个不会触发驱动程序错误的 winapi 函数。
在调试时避免 ping 肯定是避免此问题的最佳方法。您想要的方法不起作用,您的程序在遇到断点时会完全冻结,当您停止调试时会卡布。
最简单的方法是在附加了调试器的特定情况下首先不开始 ping。使用 System.Diagnostic.Debugger.IsAttached 属性在代码中检测到这一点。
这是一个很好的解决方法:
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;
}
我遇到了同样的问题,这个解决了!