第一次异常:RPC 服务器不可用
First-chance exception: The RPC server is unavailable
在开发我的 C# 应用程序时,每当我创建 OpenFileDialog 时,以下内容开始出现在 VS 输出窗格中:
First-chance exception at 0x75A6C42D (KernelBase.dll) in (myapp).exe: 0x000006BA: The RPC server is unavailable.
多年来我一直在维护这个应用程序,之前肯定从未见过,所以我开始在 SVN 中回滚以确定它何时开始。
令人费解的是,它发生和不发生的修订似乎是不一致的;如果我返回足够远,它永远不会发生,但是有一个 "area" 当我可以检查修订时,它不会发生,我会检查另一个修订,它会,然后我会 return到第一个,这次它突然会了。换句话说,我似乎无法可靠地确定它何时开始发生。
为了说明这一点,这里是我的测试的摘录,为清楚起见缩进了。数字是修订版。对于每个测试,我 "update to revision" 并进行完全重建。
3977: Exception. This is the most-recent revision.
3839: OK. Since it didn't happen, I'll start working my way back up to see when it starts
3843: OK
3852: OK
3890: Exception. So it started between 3852 & 3890.
3852: Exception. Huh?? I JUST tried 3852, and last time it didn't happen!
3778: OK. Going back this far, I've never seen it happen.
3852: Exception. I guess I'll start working my way BACK to see when it stops.
3828: Exception
3810: OK
3828: Exception. Just making sure.
3810: OK. Just making sure again.
3828: OK. What?? 3828 showed the exception last time I tried!
3852: OK. (but previously it showed the exception)
3890: Exception
我知道我可以告诉 VS 不要中断这些类型的异常,并忽略它们。但如前所述,在使用该软件多年后,我从未见过它一次 - 所以我想确定 when 和 why 他们开始了,而不是视而不见。
这与您的项目无关。当您使用 shell 对话框(如 OpenFileDialog)时,您会将 Explorer 加载到您的进程中。这带来了很多负担,您 还 加载了所有 shell 扩展。自定义资源管理器的那种,在对话框中也一样好用。
行为不端的人很常见。程序员倾向于使用更古怪的那种。这样的 shell 扩展中的任何错误现在都对您可见,调试器会告诉您。
所以,实际上没有出错,异常被捕获并处理了。 Explorer 实施反制措施以防止破坏它稳定的不良 shell 扩展并自动禁用它们。因此,您只有一个无法正常工作的跛脚鸭 shell 扩展程序,您会注意到它的可能性很低,因为它可能已经有一段时间没有工作了。
调试器可以告诉你哪一个是坏的。启用非托管调试并勾选 Debug + Exception 对话框中的 Thrown 复选框。当抛出异常时,调试器现在将停止。您不会看到任何源代码,但可以查看调用堆栈调试器 window 以获取提示。它显示堆栈中某处包含错误代码的 DLL 的名称,位于 Windows DLL 函数下方。这个名字应该给你一个暗示,哪个是麻烦制造者。 SysInternals 的 AutoRuns 实用程序非常适合禁用它们。
在开发我的 C# 应用程序时,每当我创建 OpenFileDialog 时,以下内容开始出现在 VS 输出窗格中:
First-chance exception at 0x75A6C42D (KernelBase.dll) in (myapp).exe: 0x000006BA: The RPC server is unavailable.
多年来我一直在维护这个应用程序,之前肯定从未见过,所以我开始在 SVN 中回滚以确定它何时开始。
令人费解的是,它发生和不发生的修订似乎是不一致的;如果我返回足够远,它永远不会发生,但是有一个 "area" 当我可以检查修订时,它不会发生,我会检查另一个修订,它会,然后我会 return到第一个,这次它突然会了。换句话说,我似乎无法可靠地确定它何时开始发生。
为了说明这一点,这里是我的测试的摘录,为清楚起见缩进了。数字是修订版。对于每个测试,我 "update to revision" 并进行完全重建。
3977: Exception. This is the most-recent revision.
3839: OK. Since it didn't happen, I'll start working my way back up to see when it starts
3843: OK
3852: OK
3890: Exception. So it started between 3852 & 3890.
3852: Exception. Huh?? I JUST tried 3852, and last time it didn't happen!
3778: OK. Going back this far, I've never seen it happen.
3852: Exception. I guess I'll start working my way BACK to see when it stops.
3828: Exception
3810: OK
3828: Exception. Just making sure.
3810: OK. Just making sure again.
3828: OK. What?? 3828 showed the exception last time I tried!
3852: OK. (but previously it showed the exception)
3890: Exception
我知道我可以告诉 VS 不要中断这些类型的异常,并忽略它们。但如前所述,在使用该软件多年后,我从未见过它一次 - 所以我想确定 when 和 why 他们开始了,而不是视而不见。
这与您的项目无关。当您使用 shell 对话框(如 OpenFileDialog)时,您会将 Explorer 加载到您的进程中。这带来了很多负担,您 还 加载了所有 shell 扩展。自定义资源管理器的那种,在对话框中也一样好用。
行为不端的人很常见。程序员倾向于使用更古怪的那种。这样的 shell 扩展中的任何错误现在都对您可见,调试器会告诉您。
所以,实际上没有出错,异常被捕获并处理了。 Explorer 实施反制措施以防止破坏它稳定的不良 shell 扩展并自动禁用它们。因此,您只有一个无法正常工作的跛脚鸭 shell 扩展程序,您会注意到它的可能性很低,因为它可能已经有一段时间没有工作了。
调试器可以告诉你哪一个是坏的。启用非托管调试并勾选 Debug + Exception 对话框中的 Thrown 复选框。当抛出异常时,调试器现在将停止。您不会看到任何源代码,但可以查看调用堆栈调试器 window 以获取提示。它显示堆栈中某处包含错误代码的 DLL 的名称,位于 Windows DLL 函数下方。这个名字应该给你一个暗示,哪个是麻烦制造者。 SysInternals 的 AutoRuns 实用程序非常适合禁用它们。