Visual Studio 在停止调试器后保持句柄打开
Visual Studio is keeping a handle open after stopping the debugger
我在 MS Visual Stdio 中不断收到以下错误:
Unable to copy file "obj\Debug[Program].exe" to "bin\Debug[Program].exe". The process cannot access the file 'bin\Debug[Program].exe' because it is being used by another process.
这在我关闭 and/or 停止调试器后随机发生。该程序已关闭,但 VS 为该程序保留了几个句柄。
我发现能够重新调试的唯一方法是关闭 Visual Studio,然后重新打开它,这很烦人。
知道为什么会发生这种情况,以及如何在不先关闭调试器的情况下再次 运行 调试器?
这发生在 2013 Ultimate 和 2015 Ultimate 中。
谢谢。
RagingCain 有一些优秀的解决方案。如果一切都失败了,以下将:
- 使用 Process Explorer 关闭文件句柄。
- 手动删除.exe文件
之后,应该重新编译。
我将提出一个新的解决方案,永久修复它。我一直这样做,当遇到 "Debugger" 问题时,这些问题主要发生在使用旧解决方案迁移到新的 Visual Studio 时,因此您的情况可能会有所不同。
如果切换回 AnyCPU 配置允许您再次调试,那么我相信以下步骤将解决它。
进入"Configuration Manager",将"Active solution platform:"改为任意CPU,再次点击向下箭头,然后select"Edit...",删除此处的任何自定义条目,即使它只是 x86 和 x64。
在同一个 Window 中,在您的项目下输入 Platform 并重复步骤 1。删除除 AnyCPU.
[=67= 之外的所有条目]
关闭配置管理器。
转到 "Build" 菜单并单击 "Clean Solution"。
以管理员身份重新启动 Visual Studio 2015 CTP 5。打开您的解决方案。对一个构建、发布或调试使用 "Any CPU",然后关闭它。只需验证您仍然能够基本上使用 "Any CPU" 目标。
最小化 Visual Studio,进入您的解决方案并清除所有 Bins/Release 和调试,包括任何 x86/x64 Release/Debug 文件夹,如果它们是仍然存在。
最大化 Visual Studio,进入配置管理器,重建您的平台目标 (x86/x64) 从已验证的工作中复制设置:"Any CPU".
重新开始愉快的工作!
错误是由解决方案/项目中保存的不正确、过时或损坏的 "Target Platform" 设置引起的。您可以重复上述步骤,再次删除 Project Solutions 下的 "Any CPU" 设置,因为它也可能在其中缓存了错误的 juju。使用术语 "Any CPU" settings copy settings "Empty Settings" 再次添加它也可能会解决此问题。然后您想要删除所有其他内容,并使用新的 Any CPU 设置将其重新添加为 x86/x64。
决定在我的 blog/site 上制作带有插图的操作方法。
现在,如果您的配置只有 "Any CPU" 有问题,则可能由三件事引起。 "Any CPU" 需要刷新的设置,打开的流可以等于打开的句柄,或者可能是 Whosebug 异常,只是还没有溢出。
如果 "Any CPU" 出现这种情况并且您没有其他目标解决方案,您可能首先想试试这个。添加一个新平台目标 x86/x64,从任何 CPU 复制设置都可以。这将允许您从配置管理器和解决方案中删除 Any CPU。然后您可以添加一个名为 Any CPU 的新解决方案,并将 "empty settings" 作为设置选项。然后删除 x86/x64。这会强制刷新项目中的 Any CPU 配置。尝试构建一两个。
如果它仍然发生,如果它与 "Any CPU" 一起发生,您很可能需要重新访问您的代码。这可能是一个严重的 streaming/unclosed 流问题,一个挂在系统中的糟糕的 COM 调用等。每当我尝试使用非托管代码或系统进程时,我都会尝试处理应用程序挂起和 Whosebugs。这可能会如前所述发生。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
MessageBox.Show("Congratulations, you have broken this program like no other user before you!\n\n" +
"Exception : " + ex.Message + "\n\n" + "Stack : " + ex.StackTrace,
"Ridonculous Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
try
{
MessageBox.Show("This is a Whosebug Exception!\n\n" +
"Exception : " + e.Exception.Message + "\n\n" + "Stack : " + e.Exception.StackTrace,
"Ridonculous Whosebug Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
来源:http://tech.pro/tutorial/668/csharp-tutorial-dealing-with-unhandled-exceptions
或者:如果您安装了多个 Visual Studio,甚至安装了 Vstudios 预览版,您可能会通过来回切换或 运行 更新。 Visual Studio 的最新版本实际上会通知您 JIT 错误(无论是否存在)并建议您修复 IDE.
其他任何事情都超出了我的知识水平。祝你好运!
项目属性 - 禁用 Visual Studio 托管进程。
对我有用。
我在 MS Visual Stdio 中不断收到以下错误:
Unable to copy file "obj\Debug[Program].exe" to "bin\Debug[Program].exe". The process cannot access the file 'bin\Debug[Program].exe' because it is being used by another process.
这在我关闭 and/or 停止调试器后随机发生。该程序已关闭,但 VS 为该程序保留了几个句柄。
我发现能够重新调试的唯一方法是关闭 Visual Studio,然后重新打开它,这很烦人。
知道为什么会发生这种情况,以及如何在不先关闭调试器的情况下再次 运行 调试器?
这发生在 2013 Ultimate 和 2015 Ultimate 中。
谢谢。
RagingCain 有一些优秀的解决方案。如果一切都失败了,以下将:
- 使用 Process Explorer 关闭文件句柄。
- 手动删除.exe文件
之后,应该重新编译。
我将提出一个新的解决方案,永久修复它。我一直这样做,当遇到 "Debugger" 问题时,这些问题主要发生在使用旧解决方案迁移到新的 Visual Studio 时,因此您的情况可能会有所不同。
如果切换回 AnyCPU 配置允许您再次调试,那么我相信以下步骤将解决它。
进入"Configuration Manager",将"Active solution platform:"改为任意CPU,再次点击向下箭头,然后select"Edit...",删除此处的任何自定义条目,即使它只是 x86 和 x64。
在同一个 Window 中,在您的项目下输入 Platform 并重复步骤 1。删除除 AnyCPU.
[=67= 之外的所有条目]关闭配置管理器。
转到 "Build" 菜单并单击 "Clean Solution"。
以管理员身份重新启动 Visual Studio 2015 CTP 5。打开您的解决方案。对一个构建、发布或调试使用 "Any CPU",然后关闭它。只需验证您仍然能够基本上使用 "Any CPU" 目标。
最小化 Visual Studio,进入您的解决方案并清除所有 Bins/Release 和调试,包括任何 x86/x64 Release/Debug 文件夹,如果它们是仍然存在。
最大化 Visual Studio,进入配置管理器,重建您的平台目标 (x86/x64) 从已验证的工作中复制设置:"Any CPU".
重新开始愉快的工作!
错误是由解决方案/项目中保存的不正确、过时或损坏的 "Target Platform" 设置引起的。您可以重复上述步骤,再次删除 Project Solutions 下的 "Any CPU" 设置,因为它也可能在其中缓存了错误的 juju。使用术语 "Any CPU" settings copy settings "Empty Settings" 再次添加它也可能会解决此问题。然后您想要删除所有其他内容,并使用新的 Any CPU 设置将其重新添加为 x86/x64。
决定在我的 blog/site 上制作带有插图的操作方法。
现在,如果您的配置只有 "Any CPU" 有问题,则可能由三件事引起。 "Any CPU" 需要刷新的设置,打开的流可以等于打开的句柄,或者可能是 Whosebug 异常,只是还没有溢出。
如果 "Any CPU" 出现这种情况并且您没有其他目标解决方案,您可能首先想试试这个。添加一个新平台目标 x86/x64,从任何 CPU 复制设置都可以。这将允许您从配置管理器和解决方案中删除 Any CPU。然后您可以添加一个名为 Any CPU 的新解决方案,并将 "empty settings" 作为设置选项。然后删除 x86/x64。这会强制刷新项目中的 Any CPU 配置。尝试构建一两个。
如果它仍然发生,如果它与 "Any CPU" 一起发生,您很可能需要重新访问您的代码。这可能是一个严重的 streaming/unclosed 流问题,一个挂在系统中的糟糕的 COM 调用等。每当我尝试使用非托管代码或系统进程时,我都会尝试处理应用程序挂起和 Whosebugs。这可能会如前所述发生。
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
MessageBox.Show("Congratulations, you have broken this program like no other user before you!\n\n" +
"Exception : " + ex.Message + "\n\n" + "Stack : " + ex.StackTrace,
"Ridonculous Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
try
{
MessageBox.Show("This is a Whosebug Exception!\n\n" +
"Exception : " + e.Exception.Message + "\n\n" + "Stack : " + e.Exception.StackTrace,
"Ridonculous Whosebug Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
来源:http://tech.pro/tutorial/668/csharp-tutorial-dealing-with-unhandled-exceptions
或者:如果您安装了多个 Visual Studio,甚至安装了 Vstudios 预览版,您可能会通过来回切换或 运行 更新。 Visual Studio 的最新版本实际上会通知您 JIT 错误(无论是否存在)并建议您修复 IDE.
其他任何事情都超出了我的知识水平。祝你好运!
项目属性 - 禁用 Visual Studio 托管进程。
对我有用。