第一次机会异常: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

系统RPC服务存在异常

如何处理 System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA

尝试部署袖珍电脑应用程序时 RPC 服务器不可用

“RPC 服务器不可用”