Error: A portable PDB can't be converted to mdb.

本文介绍如何在Unity中集成并调试外部DLL,包括在Windows和Mac平台上使用Visual Studio及Visual Studio for Mac创建、编译C#类库,并解决pdb到mdb转换的问题。

目标实现

Windows 平台

工具

步骤

  • 创建 C# 类库工程

  • 引用 UnityEngine.dll 等其他库

  • 添加【成功生成时】的【后期生成事件命令行】
    $(SolutionDir)Build/.Project$(ProjectName).py $(ConfigurationName) $(TargetDir) $(TargetName) $(ProjectDir)$(IntermediateOutputPath)

  • 编写 Python 脚本,以便编译完毕,可以自动拷贝 DLL 等文件到 Unity 工程

注意脚本里面要包含 pdb2mdb,例如:

[python]  view plain  copy
  1. if isWin:  
  2.     p = subprocess.Popen([currentPath + "/pdb2mdb", targetName + ".dll"], shell = True, cwd = targetPath)  
  3.     p.wait()  
  4.   
  5.     shutil.copy(targetPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")  

另外,需要用 precompile.exe 来对 protobuf 的数据 dll 文件进行序列化和反序列化,如下:

[python]  view plain  copy
  1. if isWin:  
  2.     p = subprocess.Popen([currentPath + "/precompile", targetName + ".dll""-o:" + targetName + ".AOT.dll""-t:AOTDataConfig" ], shell = True, cwd = targetPath)  

调试

在确定 DLL 对应的 mdb 文件有拷贝到 Unity 工程,就可以直接通过【附加 Unity 调试程序】来进行调试

Mac 平台

工具

  • Visual Studio for Mac 7.3.3

  • Unity 5.6

步骤

  • 将 Windows 平台所创建工程拷贝到 Mac 下

  • 准备修改 .csproj 文件 和 Python 脚本

因为安装 Visual Studio for Mac 时已经附带安装了 Mono.framework,所以不再需要额外安装 mono,自带的版本号为 5.4.1.7,如下所示:

编译工程,发现生成了 DLL 和其对应的 pdb 文件,使用命令:

/Library/Frameworks/Mono.framework/Versions/Current/bin/mono pdb2mdb.exe test.dll

提示不能进行转换,如下所示:

Error: A portable PDB can't be converted to mdb.

查阅官网(http://www.mono-project.com/docs/about-mono/releases/5.0.0/ ),提到已经使用【csc.exe】代替【mcs.exe】来进行编译了:

Replacing mcs with csc in user scripts should be straightforward but small issues can arise as command line arguments accepted by csc and features are not identical to mcs. For example, csc generates Portable PDB (.pdb) debug files instead of Mono’s MDB (.mdb) format.

而 Portable 版本的 pdb 文件是无法转换成 mdb 文件,那么就将编译方式改成mcs.exe】,因为 Unity 也是用这种方式来编译的,编辑器方法 EditorUtility.CompileCSharp 调用如下:

更改每个 .csproj 工程配置文件,在里面添加如下属性:

[xml]  view plain  copy
  1. <PropertyGroup Condition=" '$(OS)' == 'Unix' ">  
  2.   <CscToolExe>mcs.exe</CscToolExe>  
  3. </PropertyGroup>  

表示在非 Windows 平台下使用【mcs.exe】进行编译。再次编译工程,可以发现在中间目录 obj\Debug 目录下生成了对应的 mdb 文件,那么修改 Python 脚本,来将这个 mdb 文件也拷贝到 Unity 工程下:

[python]  view plain  copy
  1. if isWin:  
  2.     p = subprocess.Popen([currentPath + "/pdb2mdb", targetName + ".dll"], shell = True, cwd = targetPath)  
  3.     p.wait()  
  4.   
  5.     shutil.copy(targetPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")  
  6. else:  
  7.     shutil.copy(mdbPath + targetName + ".dll.mdb", resPath + targetName + ".dll.mdb")  

另外,precompile.exe 的调用也需要更改,如下:

[python]  view plain  copy
  1. if isWin:  
  2.     p = subprocess.Popen([currentPath + "/precompile", targetName + ".dll""-o:" + targetName + ".AOT.dll""-t:AOTDataConfig" ], shell = True, cwd = targetPath)  
  3. else:  
  4.     p = subprocess.Popen(["/Library/Frameworks/Mono.framework/Versions/Current/bin/mono", currentPath + "/precompile.exe", targetName + ".dll""-o:" + targetName + ".AOT.dll""-t:AOTDataConfig" ], shell = False, cwd = targetPath)  

调试

在确定 DLL 对应的 mdb 文件有拷贝到 Unity 工程,就可以直接通过【Run】→【Attach to Process...】来进行调试:

可以看到已经进行挂载调试了。


<think>我们正在处理一个Windows调试相关的错误:'Symbol file could not be found. Defaulted to export symbols for qwindows.dll' 根据提供的引用,这是一个符号文件找不到的问题,导致调试器使用了导出符号(export symbols)作为默认。 分析: 1. 引用[1][2][3][4]都提到了类似的错误,都是关于找不到符号文件(通常是.pdb文件)。 2. 这些引用指出,当WinDbg(或其他调试器)无法找到对应的符号文件时,会使用导出符号(即从DLL中导出的函数名)来代替,但这会缺少详细的调试信息(如局部变量、源代码行号等)。 3. 引用[4]中提到尝试通过SYMSRV(符号服务器)下载符号文件但失败(文件损坏或未找到)。 因此,解决这个问题的核心是确保调试器能够找到正确的符号文件(qwindows.pdb)。 步骤: 1. 设置符号路径(Symbol Path): - 在WinDbg中,可以通过菜单设置:File -> Symbol File Path... - 或者使用命令:.sympath 建议的设置: - 包含Microsoft的公共符号服务器:srv*https://msdl.microsoft.com/download/symbols - 如果调试的是自己开发的软件,还需要包含自己编译生成的符号文件路径。 例如,设置符号路径: .sympath SRV*c:\MySymbols*https://msdl.microsoft.com/download/symbols;c:\MyProject\Symbols 其中: - c:\MySymbols 是本地缓存目录(避免每次都下载) - https://msdl.microsoft.com/download/symbols 是Microsoft的符号服务器 - c:\MyProject\Symbols 是存放自己项目符号文件的目录 2. 重新加载符号: 设置好符号路径后,使用命令重新加载符号: .reload /f (/f 表示强制重新加载) 3. 如果qwindows.dll是第三方库(如Qt库),则需要确保有该库对应的符号文件(.pdb)。 - 对于Qt,通常在安装Qt时会有选项安装调试符号。如果没有,可能需要重新安装Qt并选择调试信息。 - 确保符号文件的版本与DLL的版本完全匹配(包括编译时间、版本号等)。 4. 如果上述步骤后仍找不到,可以尝试手动下载或放置符号文件: - 根据错误信息中提到的DLL版本,去相应的供应商网站下载符号文件。 - 然后将其放在符号路径指定的目录中。 5. 验证符号加载: 使用命令验证是否成功加载了符号: lm vm qwindows* 这会列出qwindows模块的详细信息,如果符号已加载,会显示“Symbols loaded”以及符号路径。 额外提示(根据引用[4]): - 如果遇到符号文件损坏,可以尝试删除本地缓存目录中的该符号文件,然后重新加载,让调试器重新下载。 - 确保有足够的权限访问符号服务器(有些公司网络可能需要代理)。 针对当前错误信息:'Symbol file could not be found. Defaulted to export symbols for qwindows.dll' - 由于qwindows.dll是Qt的库,因此需要确保有Qt的符号文件。如果使用的是Qt官方发布的二进制文件,可能需要从Qt的安装目录获取符号文件,或者重新安装Qt并选择包含调试符号。 如果问题仍然存在,可以尝试: - 检查qwindows.dll的版本(使用!lmi qwindows.dll或lm vm qwindows.dll),然后从Qt的官方渠道获取对应版本的符号文件。 注意:这个错误通常不会影响程序的运行,但会影响调试(没有源代码级信息)。如果只是进行基本调试(如查看调用栈),使用导出符号也可以进行,但无法查看详细的变量信息。 因此,解决方案总结: 1. 设置正确的符号路径(包括公共符号服务器和自定义路径)。 2. 确保拥有qwindows.dll对应的符号文件(pdb)。 3. 重新加载符号。 4. 验证符号是否加载成功。 相关问题: 1. 如何设置WinDbg的符号路径? 2. 如何验证符号加载成功? 3. 如何获取Qt库的调试符号? 根据上述分析,具体回答如下: </think>### 解决 "Symbol file could not be found. Defaulted to export symbols for qwindows.dll" 错误 此错误发生在使用 WinDbg 调试时,系统无法加载 `qwindows.dll` 的符号文件(.pdb),导致调试器只能使用基础的导出符号(export symbols)。以下是解决方案: #### ✅ 核心解决步骤 1. **设置符号服务器路径** 在 WinDbg 中执行: ```bash .sympath SRV*C:\Symbols*https://msdl.microsoft.com/download/symbols;SRV*C:\Symbols*https://download.qt.io/symbols ``` - `C:\Symbols` 是本地缓存目录(可自定义) - 包含 Microsoft 公共符号服务器和 Qt 官方符号服务器[^1][^4] 2. **重载符号** 执行强制重载命令: ```bash .reload /f ``` 3. **验证 Qt 符号路径** 确保路径指向 Qt 安装目录的符号文件: ```bash .sympath+ C:\Qt\5.15.2\msvc2019_64\bin # 替换为您的实际路径 ``` #### ️ 常见问题排查 1. **符号版本不匹配** - 检查 `qwindows.dll` 版本(右键 DLL → 属性 → 详细信息) - 下载 **完全匹配** 的 PDB 文件(版本号+时间戳需一致)[^2][^4] 2. **网络或权限问题** - 关闭防火墙/代理临时测试 - 以管理员身份运行 WinDbg - 检查磁盘空间(符号文件可能超过 1GB) 3. **手动下载符号** 若自动下载失败: - 从 Qt 官方仓库下载对应版本的 PDB: [https://download.qt.io/symbols](https://download.qt.io/symbols) - 放置到符号路径中的自定义目录(如 `C:\MySymbols`) #### 🔍 验证是否解决 ```bash lm vm qwindows* # 查看模块详情 ``` 输出中显示 `Symbols loaded` 即表示成功: ``` Loaded symbol image file: qwindows.dll Image path: C:\Qt\5.15.2\msvc2019_64\plugins\platforms\qwindows.dll Symbols loaded: C:\Symbols\qwindows.pdb\... ``` #### 💡 预防措施 1. 开发环境中保留完整的 Qt SDK(包含调试符号) 2. 在编译 Qt 时添加参数保留 PDB: ```bash configure -debug-and-release -force-debug-info # Qt 编译选项 ``` > **关键原理**:PDB 文件包含变量/函数名等调试信息,缺失时调试器只能使用 DLL 导出的有限符号(export symbols)[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值