Visual Studio 2013无法从网络共享生成

Visual Studio 2013 fails to build from network share

本文关键字:网络 共享 Studio 2013 Visual      更新时间:2023-10-16

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

但是Visual Studio报告:

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

然而:

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

它是由VisualStudio一秒钟前创建的,所以它必须具有写权限,并且有足够的磁盘空间。我对权限进行了一番检查,看不出有什么问题。

关于如何使这项工作发挥作用,有什么建议吗?它会很方便!

编辑:我已经将mac上的SMB升级到了最新版本,这也没有帮助!

tl;dr尝试在smb.conf中添加一个veto oplock files设置,该设置根据此处的说明指定VS解决方案的.pdb文件。


一种可能性是,所谓的权限不足是由于Visual Studio本身试图多次打开该文件。当在网络共享上构建时,甚至当网络共享在Windows服务器上运行时,我在Visual Studio中看到过类似这样的奇怪问题。然而,在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继续它的快乐之路。

这种行为被称为"机会锁定",微软在这里有一份关于如何在Windows文件服务器上配置它的文档。OplockBreakWait是服务器等待客户端响应操作锁中断请求的时间(以秒为单位)。

然而,听起来可能在您的samba实现中没有发生oplock中断请求超时。samba的文档中有一个关于如何在samba中配置操作锁的文档。它提到了一个可以在smb.conf中指定的名为veto oplock files的选项,该选项允许您指定将禁用操作锁定的某些文件您可以尝试将.pdb添加到smb.conf中的veto oplock files设置中,看看这是否解决了您的问题

顺便说一句,上面链接的samba文档提到它的默认操作锁中断等待时间是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的源代码是你的乐趣所在。:)

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

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