Visual Studio调试器的奇怪行为; “无法访问网络位置”(ERROR NETWORK UNREACHABLE)

时间:2015-01-10 00:19:25

标签: c++ visual-studio debugging visual-c++ visual-studio-2013

我从2012年(2012年,2013年,2015年预览版)开始,在多台计算机和多个项目上的每个版本的Visual Studio都体验过这一点,但我还没有弄清楚如何修复它: / p>

每当我调试64位(?) C ++控制台程序时,几分钟后看似完全随机(当我没有点击或键入任何内容时),程序的控制台窗口自动关闭,我无法再使用Visual Studio调试或逐步执行该程序。当我按下Stop并尝试重新启动调试时,我通常会得到ERROR_NETWORK_UNREACHABLE:

// MessageId: ERROR_NETWORK_UNREACHABLE
// MessageText:
// The network location cannot be reached. For information about network troubleshooting, see Windows Help.
#define ERROR_NETWORK_UNREACHABLE        1231L

如果我尝试手动附加到该过程,我会收到错误:

Unable to attach to the process.

我发现的唯一解决方法是重新启动Visual Studio。我找不到任何其他方法来修复它,我已经尝试过运行Process Monitor但却找不到任何东西。

导致此问题的原因是什么?如何解决?


(?)进一步检查后,似乎这只发生在64位模式下,但我不是100%肯定。

5 个答案:

答案 0 :(得分:9)

好的,这是错误的

我也有这个bug的问题,在我的情况下,它发生在每个其他调试会话。这意味着调试 - >停止 - >调试 - > bug - >重启visual studio - >开始(在一整天内重复每一分钟)。

毋庸置疑,我被迫寻找解决方案。所以昨天我尝试了procmon,花了好几个小时看着API监视器的差异,看了插件,netstat等等,但没有发现任何东西。我放弃了。

<强>今天

直到今天。

为了追踪我今天程序中的一个愚蠢的错误,我启动了appverifier。对于我的应用程序,我运行了基础知识&#39;测试并点击保存。几个小时后,这导致我的程序中的错误,这是这样的(非常简化的版本):

void* dst = _aligned_malloc(4096, 32);
memcpy(dst, src, 8192);

显然这是一个错误,显然需要修复。我在memcpy行放置断点后发现了错误,该行未执行。

停止后&#39;调试&#39;我再次惊讶地发现我可以第二次调试程序。现在,几个小时后,这个烦人的错误在这里再也没有出现。

所以似乎正在进行

所以...显然我程序中的数据正在渗透到调试器的数据或执行空间中,这反过来又会产生错误。

我看到你在想:不,这不应该发生......你是对的;但显然确实如此。

那么如何解决呢?基本上修复程序(更具体地说:堆损坏问题)似乎会使VS调试器错误消失。使用appverifier.exe(它在Windows的调试工具中)将为您提供一个良好的开端。

为什么会这样?

自VS2012以来,VC ++使用不同的方式来管理堆。 Hans Passant在此解释:Does msvcrt uses a different heap for allocations since (vs2012/2010/2013)

基本上发生的事情是堆损坏会破坏你的调试器。 AppVerifier基本设置将确保在应用程序执行某些操作以破坏堆之前触发断点。

所以,现在发生的事情是,在进程打破堆之前,会触发断点,这通常意味着您将终止进程。最终结果是在终止程序之前堆仍将处于完好状态,这意味着您的调试器仍将起作用。

<强>&#34;试验&#34;

  • 在使用appverifier之前 - 每2分钟触发一次错误
  • 使用appverifier时 - VS调试器已稳定5天(并且正在计算)

答案 1 :(得分:2)

这当然是一个环境问题。总是很难排除故障,SysInternals&#39; Process Monitor和Process Explorer等实用程序是您首选的主要武器。调试时可能会产生网络错误的一些非直观方法:

  • 从VS2012开始,C运行时库进行了非常严格的修改,如果程序破坏了堆,可能会导致很难诊断错误行为。很像@atlaste描述。从时间纪念开始,CRT总是创建自己的堆,底层调用是HeapCreate()。不再,它现在使用GetProcessHeap()。现在处理用/ MT构建的DLL非常方便。但是,由于具有非常尖锐的优势,您现在可以轻松破坏Microsoft代码所拥有的内存。如果您无法重新连接64位程序,则不必强烈指出,您必须杀死msvsmon.exe以清除损坏。

  • Microsoft Symbol Server为Microsoft可执行文件提供PDB。他们通常删除了源+行号信息,但不是全部。特别是不适用于CRT。那些PDB是在Redmond的DevDiv拥有的构建服务器上构建的,它在F:驱动器上有源代码。一些是从E:驱动器构建的,Patterns + Practices使用它(不太可能在C ++程序中)。你的调试器会去那里试图找到源代码。这通常会很好地结束,它会很快放弃,但如果您的机器也使用这些驱动器号也不会。通过清除符号缓存并使用工具+选项,调试,符号禁用符号服务器进行诊断。

  • winapi患有两种令人讨厌的病毒感染,它从另一种操作系统继承,为任何过程增加了全局状态。 PATH环境变量和默认工作目录。使用控制面板+系统+高级+环境查看PATH,将故意小文本框的内容复制/粘贴到文本编辑器中。确保它是干净利落的,通常麻烦的一些瘫痪是正常的顺便说一句。不要俘虏。使用默认目录时遇到问题要难以排除故障。当您使用Process Monitor时,两者都会弹出。

没有任何冲击力的解释,这是一个棘手的问题,但你可以看到黑暗的角落。

答案 2 :(得分:0)

我有同样的问题。认为它与64位控制台应用程序有关,几乎所有调试会话都可以轻松触发它。但是,它也发生在64位Windows应用程序上。现在我在32位Windows应用程序上看到它。我在一个桌面上运行Windows 8.1 pro,其中包含最新版本的vs 2013,没有远程调试。我的(添加)扩展包括Visual Assist,Advanced Installer,ClangFormat,Code Alignment,Code Compare,Duplicate Selection,Productivity Power Tools 2013和Visual SVN。

我发现了&#34; Visual Studio 2013 \ Settings \ CurrentSettings.vssettings&#34;文件被破坏了。您可以删除此文件并通过重新启动VS重新创建它,也可以尝试编辑XML。然后我保留了一个好的设置文件的副本,当它再次被破坏时我用它来替换它。

就我而言,损坏的行以

开头
</ToolsOptionsSubCategory><ToolsOptionsSubCategory name="XAML" RegisteredName="XAML"

......而且它非常长(我认为这就是为什么它容易腐败)。

答案 3 :(得分:0)

我刚刚在菜单中停用

工具&gt;选项

  

调试&gt;编辑并继续

     

仅限原生的选项&gt;启用原生编辑并继续

现在它没有给出阻止调试对象应用程序启动的那个愚蠢错误。

答案 4 :(得分:0)

VS2015也遇到了同样的问题。当我第二次运行调试器时,一个简单的Hello World程序给出了这个错误是非常令人沮丧的。尝试卸载并重新安装并且没有工作。

最后,https://social.msdn.microsoft.com/Forums/vstudio/en-US/8dce0952-234f-4c18-a71a-1d614b44f256/visual-studios-2012-cannot-findlaunch-project-exe?forum=vsdebug

中提到的解决方案

的工作。使用工具 - >导入和导出设置重置所有visual studio设置。现在问题还没有发生。