【问题标题】:How does the Visual Studio debugger know where the source is when loading an assembly at runtime?在运行时加载程序集时,Visual Studio 调试器如何知道源的位置?
【发布时间】:2017-03-30 14:44:20
【问题描述】:

考虑以下代码:

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 core 1.1 应用程序中编译,args 在其调试输出目录中包含 .net core 中通用 hello world 的 dll 的路径。

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

当我从程序集的内存副本加载时,VS 调试器如何知道在哪里找到源代码?

【问题讨论】:

  • 完全一样,您可以从调试文件夹中的 exe 运行应用程序,然后转到 Visual Studio 并“附加到进程”,然后进行调试。这是因为您是从 Debug 文件夹运行的。

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


【解决方案1】:

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

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

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

...

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

它还会在其他位置搜索.pdbs,但当您尝试将程序集与其在磁盘上的文件分离时,这似乎是最有可能的来源。

【讨论】:

    【解决方案2】:

    答案在这个MSD页面:

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

    Also,

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

    调试器在哪里搜索 .pdb 文件

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 2023-04-07
      • 2017-01-25
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多