创建 mdb 文件以在 Unity 中调试托管 DLL
Posted
技术标签:
【中文标题】创建 mdb 文件以在 Unity 中调试托管 DLL【英文标题】:Create mdb file to debug managed DLL in Unity 【发布时间】:2020-07-15 02:11:05 【问题描述】:我正在尝试在 Unity 中调试我的托管 DLL。它曾经在 Unity 2018.x 上运行良好
现在我有了 Unity 2019.3,但我无法再调试(我的 DLL 工作正常,但无法调试它们)。
我的 DLL 及其 pdb 文件位于 Assets 文件夹中。这曾经足以调试它们。
阅读此文档:https://docs.unity3d.com/Manual/UsingDLL.html,我正在尝试创建 mdb 文件。
第一个问题,文档说我必须将 .pdb 文件作为参数传递,而谷歌上的大多数链接都说要传递 .dll
此链接还指出我应该更改 .bat 文件的工作目录以便能够使用 pdb2mdb.exe:https://answers.unity.com/questions/294195/pdb2mdb-usage-error-from-command-line.html
这是我的代码:
set PathToLib="Libraries\"
if exist Libraries\LibBDD.dll (
echo Before switching directory for my lib %CD%
cd %PathToLib%
echo new directory %CD%
@pause
"C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe" LibBDD.dll
@pause
cd ..\..\..\..\..\
echo LibBDD done, new directory %CD%
)
首先我不确定我的 CD 命令是否有效,因为路径保持不变。但我没有任何例外。
使用此代码,我得到:
致命错误:Microsoft.Cci.Pdb.PdbDebugException:未知自定义 元数据项目种类:6à Microsoft.Cci.Pdb.PdbFunction.ReadCustomMetadata(BitAccess 位)à Microsoft.Cci.Pdb.PdbFunction..ctor(字符串模块,ManProcSym 过程, BitAccess 位)à Microsoft.Cci.Pdb.PdbFunction.LoadManagedFunctions(字符串模块, BitAccess 位,UInt32 限制,布尔读取字符串)à Microsoft.Cci.Pdb.PdbFile.LoadFuncsFromDbiModule(BitAccess 位, DbiModuleInfo 信息、IntHashTable 名称、ArrayList funcList、布尔值 readStrings,MsfDirectory 目录,Dictionary`2 nameIndex,PdbReader 阅读器)à Microsoft.Cci.Pdb.PdbFile.LoadFunctions(流读取, BitAccess 位,布尔型 readAllStrings) à Pdb2Mdb.Driver.Convert(AssemblyDefinition 程序集,流 pdb, MonoSymbolWriter mdb)
没有我得到的 CD:
单 pdb 到 mdb 调试符号存储转换器用法:pdb2mdb 程序集
我正在使用 Visual Studio 2019 社区。p>
我不确定我做错了什么以及为什么我无法在 Unity 中进行调试。我尝试将 csproj 添加到 VS 中的解决方案中,但它不再起作用,符号未加载。
【问题讨论】:
这能回答你的问题吗? Variables are not behaving as expected 【参考方案1】:2019.3 中似乎发生了一些变化,出于某种原因,Unity 不再自动生成 mdb 文件。
解决方案是将您的 pdb 设置为 portable 而不是 full,这是默认设置,您可以按照 here 的说明进行操作。在此之后,您不再需要 mdb 文件。
以上链接中的分步说明:
在解决方案资源管理器中,选择项目。
选择属性图标(或按Alt+Enter)。
在侧窗格中,选择 Build(或在 Visual Basic 中选择 Compile)。
在配置列表中,选择Debug或Release。
选择高级按钮(或 Visual Basic 中的高级编译选项按钮)。
在 Debugging information 列表(或 Visual Basic 中的 Generate debug info 列表)中,选择 Portable。
构建您的项目。
编译器在与可执行文件或主输出文件相同的文件夹中创建符号文件。
您也可以通过here 和here 了解它
【讨论】:
另外,请注意,看起来简单的“单步执行”不起作用 - 我需要使用我正在单步执行的函数打开文件并在此处放置断点。因此,如果我在这一行上放置一个断点: q.Enqueue();我需要从同一个 VS 实例中的库源中打开带有 Queue 类的文件,并在那里放置一个断点。然后即使是常规步骤也能正常工作。这相当复杂,因为我需要在源代码中手动找到该类,但这是有道理的,因为源代码位于完全不相关的项目中。只是为了确定,这是预期的行为吗?) 是的!这对我完全有用,谢谢!使用 F11 也可以正常使用。以上是关于创建 mdb 文件以在 Unity 中调试托管 DLL的主要内容,如果未能解决你的问题,请参考以下文章
使用 PDF 内容创建存档/.pkg 以在 Apple 托管时出现可执行文件的奇怪错误
在 logcat 中打印变量值以在 android 中进行调试