在运行时加载程序集时,Visual Studio调试器如何知道源的位置?

时间:2017-03-30 06:27:39

标签: c# .net visual-studio debugging .net-assembly

请考虑以下代码:

private static void Main(string[] args)
{
    var exe = new MemoryStream(File.ReadAllBytes(args[0]));
    var assembly = AssemblyLoadContext.Default.LoadFromStream(exe);
    assembly.EntryPoint.Invoke(null, new object[] { new string[0] });
}

该程序是在.net核心1.1应用程序中编译的,args包含.net核心的通用hello世界的dll路径,在它的调试输出目录中。

当我运行该程序时,它从内存中的dll副本加载程序集,然后调用入口点。 Visual Studio似乎成功地认识到这个dll与我在解决方案中打开的hello world项目相同,我可以逐步调试这个被调用的程序。

当我从程序集的内存中副本加载时,VS Debugger如何知道在哪里找到源?

2 个答案:

答案 0 :(得分:2)

首先找到.pdb,然后从那里找到源文件。

它如何找到.pdb?来自Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger

  

在Visual Studio IDE中调试项目时,调试器会知道代码的.pdb和源文件的默认位置。

...

  

(默认情况下,如果您在计算机上构建了DLL或可执行文件,则链接器会将相关.pdb文件的完整路径和文件名放在DLL或可执行文件中。调试器首先检查以查看如果符号文件存在于DLL或可执行文件中指定的位置。这很有用,因为您总是有符号可用于您在计算机上编译的代码。)

还有其他地方也会搜索.pdb,但当您试图将程序集与磁盘上的文件分离时,这个似乎是最可能的来源。

答案 1 :(得分:1)

答案在MSD页面中:

  

使用Visual Studio调试器的全部功能(如点击   断点)当附加到进程时,可执行文件必须完全正确   匹配您的本地源和符号(也就是说,调试器必须是   能够加载正确的符号(.pbd)文件)。默认情况下,这个   需要调试版本。

Also

  

程序数据库(.pdb)文件,也称为符号文件,映射   您在源文件中为类,方法和创建的标识符   编译时使用的标识符的其他代码   项目的可执行文件。 .pdb文件还会映射语句   可执行文件中执行指令的源代码。该   调试器使用此信息来确定两个关键部分   信息:显示在的源文件和行号   Visual Studio IDE和可执行文件中的位置在何时停止   你设置了一个断点。符号文件还包含原始文件   源文件的位置,以及可选的源位置   可以从中检索源文件的服务器。

调试器搜索.pdb文件的位置

  1. DLL或可执行文件中指定的位置 文件。
  2. .pdb文件,可能与DLL存在于同一文件夹中 或可执行文件。
  3. 任何本地符号缓存文件夹。

  4. 指定的任何网络,Internet或本地符号服务器和位置,例如Microsoft符号服务器(如果已启用)。