【问题标题】:Visual Studio 2013 fails to build from network shareVisual Studio 2013 无法从网络共享构建
【发布时间】:2015-12-19 18:55:36
【问题描述】:

我在 Mac 上有一个项目,我正在尝试在 PC 上通过网络共享构建该项目。

然而 Visual Studio 报告:

1>LINK : 致命错误 LNK1201: 写入程序数据库时出错 'X:\XYZ\Builds\VisualStudio2013\Debug\XYZ.pdb';检查不足 磁盘空间、路径无效或权限不足

然而:

>dir XYZ.pdb
 Directory of X:\XYZ\Builds\VisualStudio2013\Debug
20/04/2015  17:32         9,456,640 XYZ.pdb
               0 Dir(s)  15,825,752,064 bytes free

它是由 VisualStudio 在一秒钟前创建的,因此它必须具有写入权限并且有足够的磁盘空间。我对权限进行了一番探讨,但看不出有什么问题。

关于如何进行这项工作的任何建议?会很方便的!

编辑:我已将 Mac 上的 SMB 升级到最新版本,但这也无济于事!

【问题讨论】:

  • 您是否拥有正确的安全权限?
  • 是的。 Visual Studio 本身创建了它抱怨它无法写入的文件。我可以从该文件夹(使用 Mac 上的 Samba 共享)读取和写入。

标签: c++ visual-studio


【解决方案1】:

tl;dr 尝试将 veto oplock files 设置添加到您的 smb.conf 中,按照 here 的说明指定 VS 解决方案的 .pdb 文件。


一种可能性是,假设缺少权限是由于 Visual Studio 本身尝试多次打开文件。在网络共享上构建时,我在 Visual Studio 中看到过类似的奇怪问题,即使网络共享在 Windows 服务器上运行也是如此。但是,在 Windows Server 上,在这种情况下会出现超时(默认为 35 秒),之后它将允许打开第​​二个文件句柄,然后继续其业务。我最终不得不查看 Wireshark 对 SMB 流量的跟踪,以了解那里发生了什么。

IIRC,交流是这样的:

  1. VS 打开 .pdb 的句柄。默认情况下,它接收独占访问权限,因为它是当时打开文件的唯一句柄。

  2. VS 尝试打开 .pdb 的第二个句柄,但它目前已为独占访问打开。

  3. SMB 服务器发送消息询问持有第一个句柄(也恰好是 VS)的客户端是否可以将句柄切换到共享访问模式。

  4. VS 无法响应服务器的请求,因为它被阻止等待服务器对其打开第二个句柄的请求的响应。

  5. SMB 服务器上的超时到期,之后它会强制将句柄切换到共享模式。 Windows SMB/CIFS 服务器默认启用此超时。

  6. SMB 服务器现在允许打开第​​二个文件句柄,VS 继续愉快地前进。

这种行为称为“机会锁定”,Microsoft 有一个关于如何在 Windows 文件服务器上配置它的文档hereOplockBreakWait 是服务器等待客户端响应 oplock 中断请求的时间量(以秒为单位)。

但是,听起来 oplock 中断请求超时可能不会发生在您的 samba 实现上。在 samba 的文档中有一个文档here 介绍了如何在 samba 中配置 oplocks。它提到了一个可以在smb.conf 中指定的选项,称为veto oplock files,它允许您指定将禁用oplocking 的某些文件。 您可以尝试将您的 .pdb 添加到您的 smb.conf 中的 veto oplock files 设置中,看看这是否可以解决您的问题。

顺便说一句,上面链接的 samba 文档提到它的默认 oplock 中断等待时间为 0,我认为这会禁用超时,从而导致您看到的行为。不幸的是,该文档中指向oplock break wait time 选项的实际文档的链接已损坏,因此我无法确定它的作用。根据链接的 samba 文档,"Samba recommends: “Do not change this parameter unless you have read and understood the Samba oplock code,”" 所以你可能最好尝试修改veto oplock files 而不是oplock break wait time,除非阅读 samba 的源代码是你的乐趣。 :)

【讨论】:

  • 可悲的是,这是一个很棒的回应,它还没有修复它。日志中有很多这些,但我认为它们与问题无关:11/05/2015 16:56:49.603 smbd[36720]: File system does not support 0X40000, file attrs 11/05/2015 16:56:49.603 smbd[36720]:文件系统不支持 0X0 时间属性 11/05/2015 16:56:49.603 smbd[36720]:文件系统不支持 0X0,大小属性
  • 啊 - 等等 - smb 问题。我会回复你的:)
  • 好的 - 这是一个很好的答案 - 我会给你奖金。 mac 上的 smb 现在有一个(可能无法解决的)错误导致它核心转储,所以我仍然需要测试它!
  • @JCx 很抱歉听到您仍有问题。几年来我没有在 OS X 上使用过 samba,但当我不得不使用它时,它真的是一团糟。有一段时间,我们实际上必须每隔一两天重新启动一次服务器,因为如果我们不这样做,服务器会在平均运行 2-3 天后出现内核崩溃。
  • 我已经完全放弃并转而使用 Parallels 下的 Visual Studio 了。但这是一个很好的答案;-)
【解决方案2】:

我知道这个问题的答案已经完成,但接受的答案在我的情况下不起作用。 这是我的问题的解决方案: 当项目规模扩大且 ".pdb" 文件大小超过 300MB 时,就会产生错误。 我在我的项目中更改调试信息属性并成功编译它。 您只需要将项目中的“Debug information format”更改为“C7 compatible (/Z7)”,如下路径即可。

配置属性 >> C/C++ >> 常规 >> 调试信息 格式

【讨论】:

  • 这是一个完全不同的问题。它可能会导致相同的错误消息,但这不会使您的答案与此处相关。分享你的答案很好,它肯定会帮助其他人,但你能找到一个更相关的问题来发布它作为答案吗?
  • @hvd :当你说答案与问题不完全相关时你是对的,但我把我的答案放在这里,因为错误信息和许多其他人一样(比如上周的我)寻找该错误的解决方案,将来到这篇文章。所以我决定为这些人分享我的答案,只是为了帮助他们。
猜你喜欢
  • 2012-09-29
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多