从2012年(2012年,2013年,2015年预览)开始,我在每台Visual Studio版本中都在多台计算机和多个项目上都遇到了这种情况,但是我还没有弄清楚如何解决它:

每当我调试64位(?)C++控制台程序时,经过几分钟并且看似完全随机(当我没有单击或键入任何内容时),该程序的控制台窗口会自发关闭,并且我无法再调试或使用Visual Studio逐步执行该程序。当我按停止并尝试重新启动调试时,通常会收到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%。

最佳答案

好吧,这是错误的

我也有此错误的问题,就我而言,它在其他所有调试 session 中都发生过。这意味着调试->停止->调试->错误->重新启动Visual Studio->开始(一整天重复一遍)。

不用说,我被迫寻找解决方案。所以昨天我尝试procmon,花了几个小时查看API监视器的差异,查看了插件,netstat等,等等,却一无所获。我放弃。

今天

直到今天。

为了查找程序中的一个愚蠢错误,我启动了Appverifier。对于我的应用程序,我运行了“基本”测试,然后单击“保存”。几个小时后,这导致我发现程序中的错误,该错误类似于以下内容(极其简化的版本):

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

显然,这是一个错误,显然需要修复。在未执行的memcpy行上放置断点后,我注意到了错误。

停止并再次“调试”后,我很惊讶地发现我实际上可以第二次调试该程序。而现在,几个小时后,这个烦人的错误没有再出现。

那么似乎正在发生什么

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

我看到您在想:不,这不应该发生的。但显然是的。

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

为什么有效

从VS2012开始,VC++使用另一种方式来管理堆。汉斯·帕桑(Hans Passant)在此处进行了说明:Does msvcrt uses a different heap for allocations since (vs2012/2010/2013)

基本上发生的是堆损坏将破坏调试器。 AppVerifier的基本设置将确保在应用程序进行破坏堆的操作之前触发断点。

因此,现在发生的事情是,在进程将中断堆之前,将触发一个断点,这通常意味着您将终止该进程。最终结果是,在终止程序之前,堆仍将完好无损,这意味着调试器仍将运行。

“测试”
  • 使用Appverifier之前-每2分钟触发一次错误
  • 使用Appverifier时-VS调试器已经稳定5天了(并且还在增加)
  • 关于c++ - Visual Studio调试器的异常行为; “The network location cannot be reached”(ERROR_NETWORK_UNREACHABLE),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27871398/

    10-17 01:27