第一次机会异常:RPC 服务器不可用
Posted
技术标签:
【中文标题】第一次机会异常:RPC 服务器不可用【英文标题】:First-chance exception: The RPC server is unavailable 【发布时间】:2015-01-10 08:52:05 【问题描述】:在开发我的 C# 应用程序时,每当我创建 OpenFileDialog 时,VS 输出窗格中都会出现以下内容:
First-chance exception at 0x75A6C42D (KernelBase.dll) in (myapp).exe: 0x000006BA: The RPC server is unavailable.
我多年来一直在维护这个应用程序,而且之前肯定从未见过这种情况,所以我开始在 SVN 中回滚以确定它何时开始。
令人费解的是,发生和未发生的修订似乎不一致;如果我回溯到足够远,它永远不会发生,但是当我可以检查修订时,有一个“区域”,它不会发生,我会检查另一个修订,它会,然后我会回到第一个,这时间一下子就会了。换句话说,我似乎无法可靠地确定它何时开始发生。
为了说明这一点,这里是我的测试的摘录,为了清楚起见,缩进了。数字是修订版。对于每个测试,我都会“更新到修订版”并进行完全重建。
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 不要中断这些类型的异常,并忽略它们。但如前所述,在开发此软件多年后,我从未见过它一次 - 所以我想确切地确定何时以及为什么他们开始了,而不是只是视而不见。
【问题讨论】:
从您的测试来看,它似乎是“随机的”,因此错误可能不在您的代码中。由于 RPC 正在调用远程资源,请检查您的网络、RPC 服务器活动等。例如域身份验证可能会导致此问题。 所有网络连接都关闭时会发生这种情况。此外,奇怪的是,它似乎永远不会发生在足够旧的版本中(即大约 3700 左右的修订版),它总是发生在当前的修订版上。因此,虽然它 似乎 不像它在我的代码中......但它的行为对我来说仍然是荒谬的。为什么我可以通过回滚修订来停止它,并通过前滚来启动它 - 但它发生的精确修订并不那么不可预测? 尝试多次重建单个版本,结果总是相同还是每次构建的行为不同? 我只尝试了 14 次重建:r3982(当前)每次都这样做(连续 7/7 次),r3783(旧)从未这样做过(0/7)。 【参考方案1】:这与您的项目无关。当您使用 shell 对话框(如 OpenFileDialog)时,您会将 Explorer 加载到您的进程中。这带来了很多包袱,您还加载了所有的 shell 扩展。自定义资源管理器的那种,它们在对话框中也能正常工作。
行为不端是很常见的。程序员倾向于使用更古怪的类型。现在,您可以看到此类 shell 扩展中的任何故障,调试器会告诉您。
所以,实际上并没有出错,异常被捕获并处理。 Explorer 对破坏其稳定性的不良 shell 扩展实施对策并自动禁用它们。所以你只是有一个不工作的跛脚鸭壳扩展,你注意到的可能性很低,因为它可能有一段时间没有工作了。
调试器可以告诉你哪个是坏的。启用非托管调试并勾选 Debug + Exception 对话框中的 Throw 复选框。抛出异常时,调试器现在将停止。您不会看到任何源代码,但您可以查看调用堆栈调试器窗口以获取提示。它显示包含错误代码的 DLL 名称,该名称位于堆栈中某个位置,位于 Windows DLL 函数下方。这个名字应该给你一个提示,哪个是麻烦制造者。 SysInternals 的 AutoRuns 实用程序非常适合禁用它们。
【讨论】:
嗯,很好的洞察力。但是,(1)我不记得最近添加了任何远程(我对系统上安装的内容非常了解,并且(2)如果它与项目完全无关,不是吗?似乎很奇怪,回滚修订会对这是否出现有任何影响?更改修订不会改变存在的资源管理器扩展,所以我希望它要么总是出现,要么永远不会出现——不管我是哪个修订调试。不是吗? 另外,据我所知,调用堆栈中没有任何明显可疑的地方。似乎所有的 MS DLL:screencast.com/t/VI1jPAQY0aH davclnt.dll 不属于您的进程。好吧,要摆脱它并不容易。翻转忽略位。 ...几个月前我在玩 WebDAV。尽管如此,我还是不明白为什么只有在运行某些修订版时才会出现这种情况,而在其他修订版中不会出现。刚试了14次:连续重建r3982 7x,每次都显示异常;连续重建 r3783 7x,但从来没有。根据最初的问题,有些修订是不一致的。像这样的异常似乎应该始终如一地重现 - 如果它与我的代码无关,则不应受到我正在使用的修订版的影响。 就我而言,是过时的驱动器映射导致了问题。结果不一致,因为驱动器映射失败结果被缓存。使用文件资源管理器从“这台电脑”中删除损坏的驱动器映射,错误就会消失。以上是关于第一次机会异常:RPC 服务器不可用的主要内容,如果未能解决你的问题,请参考以下文章
RPC 服务器不可用。 (HRESULT 异常:0x800706BA)连接到远程计算机时
Get-WmiObject : RPC 服务器不可用。 (HRESULT 异常:0x80070 6BA
如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA