Visual Studio出现C1090、LNK1318类PDB相关错误如何解决?
错误码含义、成因及解决方案
错误码23、24含义
- C1090/LNK1318错误中的23、24是微软PDB处理接口的内部状态码:
- 错误码23:对应RPC通信失败,即编译器/链接器与负责PDB文件读写的后台进程通信中断,你遇到的0x6BA(RPC服务器不可用)、0x6BE(RPC服务不存在)、0x5(访问权限错误)都是该类通信失败对应的具体Windows系统错误码
- 错误码24:对应PDB文件句柄泄漏或文件锁残留,后台进程无法获取指定PDB文件的读写权限,通常是前一次编译/链接异常终止后残留的独占锁未释放导致
核心成因
- 150个项目的大解决方案开启并行编译时,msbuild、cl.exe、link.exe同时读写共享PDB文件(比如解决方案级别的共用PDB,或者中间输出路径重复的PDB),触发PDB后台进程的并发访问bug,VS2019 16.10+版本该bug触发概率极高,VS2022仅做了部分修复未完全解决
- 杀毒软件/安全防护程序实时扫描PDB文件时,抢占了文件锁,导致编译器/链接器无法读写
- 长时间不重启系统时,PDB后台进程
mspdbsrv.exe出现内存泄漏、句柄泄漏,后续所有PDB读写请求都会失败,这就是为什么只有重启系统才能临时解决的根本原因
修复与规避方案
配置层面调整(优先级最高,可解决90%以上场景)
- 关闭编译器的并行PDB写入功能:在项目属性→C/C++→常规,将多处理器编译选项调整为否,或者添加编译器参数
/Zf-禁用并行PDB生成 - 禁用共享PDB:将项目属性→C/C++→输出文件中的程序数据库文件名从默认的
$(IntDir)vc$(PlatformToolsetVersion).pdb修改为针对每个项目唯一的命名,比如$(IntDir)$(ProjectName).pdb,避免多个项目共用同一个PDB文件导致访问冲突 - 调整链接器PDB生成逻辑:在项目属性→链接器→调试,关闭生成调试信息的增量选项,或者添加链接器参数
/INCREMENTAL:NO禁用增量链接
临时应急方案(无需重启系统)
- 出现错误后,打开任务管理器,手动结束所有
mspdbsrv.exe进程,该进程会在下次编译时自动重启,即可清除残留的句柄/锁问题 - 临时关闭杀毒软件对项目输出目录、中间目录的实时扫描
永久修复方案
- 升级到VS2022 17.14及以上版本,微软在该版本中修复了大部分大项目并行编译下的PDB访问冲突bug
- 条件允许的情况下,将大解决方案拆分为多个小的解决方案,减少单次编译时并行访问PDB的进程数量
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

