创建 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)。

    配置列表中,选择DebugRelease

    选择高级按钮(或 Visual Basic 中的高级编译选项按钮)。

    Debugging information 列表(或 Visual Basic 中的 Generate debug info 列表)中,选择 Portable

    构建您的项目。

编译器在与可执行文件或主输出文件相同的文件夹中创建符号文件。

您也可以通过here 和here 了解它

【讨论】:

另外,请注意,看起来简单的“单步执行”不起作用 - 我需要使用我正在单步执行的函数打开文件并在此处放置断点。因此,如果我在这一行上放置一个断点: q.Enqueue();我需要从同一个 VS 实例中的库源中打开带有 Queue 类的文件,并在那里放置一个断点。然后即使是常规步骤也能正常工作。这相当复杂,因为我需要在源代码中手动找到该类,但这是有道理的,因为源代码位于完全不相关的项目中。只是为了确定,这是预期的行为吗?) 是的!这对我完全有用,谢谢!使用 F11 也可以正常使用。

以上是关于创建 mdb 文件以在 Unity 中调试托管 DLL的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDF 内容创建存档/.pkg 以在 Apple 托管时出现可执行文件的奇怪错误

在 Windows 服务中打开 mdb 文件

将解决方案发布到文件夹时出错 - 自托管 .NET

在 logcat 中打印变量值以在 android 中进行调试

未加载符号文件以在 Visual Studio 2012 中调试自定义项目

什么是循环销售数据的JSON以在Unity中创建图形的最佳方法?