Unity中使用外部C#dll配置断点调试

本文总结个人使用unity调试第三方库的些许经验

解释关于dll,pdb,mdb的概念
dll:
DLL(Dynamic Link Library)是一种微软Windows操作系统中常见的文件类型,它包含了一系列的可执行代码以及数据,这些代码和数据可以被其他程序调用和使用。 DLL文件通常包含了一个或多个函数、数据、类、资源等,这些可以被其他程序使用。与静态链接库(Static Link Library)不同,DLL在运行时动态加载到内存中,因此它们被称为动态链接库。 DLL文件的主要优点是可以共享代码和数据,避免了代码的重复编写,提高了代码的重用性。通过将常用的功能封装到DLL中,其他程序可以通过简单地调用DLL中的函数或使用其中的类来实现相应的功能,从而简化了开发过程。
pdb:
PDB(Program Database)是一种微软Windows平台上的调试信息文件格式,用于存储编译后的程序的调试信息。这些调试信息包括了源代码文件、行号、变量名称、函数名称等。

PDB文件通常与编译后的可执行文件(例如.EXE或.DLL)一起生成。它们包含了编译器产生的调试符号信息,以及源代码的位置信息,使得调试器能够将执行的机器码映射回源代码,并且在调试器中显示正确的变量名称和行号等信息。

在调试过程中,开发者可以使用PDB文件来设置断点、查看变量值、跟踪函数调用等操作,以帮助定位和解决代码中的问题。
mdb:
在上下文中,"mdb"通常指的是Mono调试符号文件(Mono Debug Symbol),它是用于在Mono环境中进行调试的文件。

在Unity中,当你编译C#脚本时,Unity会生成相应的可执行文件(例如.dll文件),以及用于调试的.mdb文件。这个.mdb文件包含了调试信息,如源代码文件、行号、变量名称等,以便在Unity编辑器中进行调试。调试信息使得你能够在代码中设置断点、查看变量的值以及执行其他调试操作。

因此,在Unity中,如果你想要在编辑器下调试C#脚本,你通常需要对应的.mdb文件。
unity Editor是运行在mono环境中的,应该使用mdb文件获取调试信息的,为什么也能使用pdb文件获取调试信息?
Unity的脚本(主要是C#脚本)在运行时是通过Mono运行时来执行的。Mono是一个跨平台的.NET实现,它与微软的.NET框架兼容,并且提供了一些额外的功能和扩展。

PDB(Program Database)是微软.NET编译器产生的调试信息文件,通常用于在Windows平台上进行调试。这些文件包含了源代码的位置、变量和函数的调试信息等。

尽管Unity使用Mono作为脚本的运行时环境,但是Unity编辑器和Mono运行时之间并没有直接关联,因此Unity编辑器默认情况下不会使用PDB文件进行调试。

然而,你可以使用一些第三方工具或技术来进行调试,比如你可以使用Visual Studio作为外部调试器来调试Unity项目,这样你就可以利用PDB文件进行调试了。不过,这种方法相对复杂,而且在跨平台开发中可能不是最佳选择。

在Unity中,通常使用的是.mdb文件来进行调试,因为Unity编辑器和Mono运行时直接支持.mdb文件,这使得在Unity编辑器中进行调试更加方便。
在unity中使用pdb特别注意点
在unity中使用的pdb要求是便携的pdb文件,如果使用通常意义的pdb,unity是没有办法读取的。会有如下警告图示,无法读取源程序符号信息。 Unity is only able to load mdb or portable-pdb symbols. Assets/GameFramework/Libraries/GameFramework.pdb is using a legacy pdb format. 我们可以通过修改dll库源代码(当然是需要有源码,或者已经提供配套的pdb文件)编译器选项解决这个问题。调试信息选择可移植,如下图:

实操

按以上方法生成好pdb文件一并放入unity资产目录中(任意Assets目录下)。 断点调试截图: