首页 > 解决方案 > Mono.Cecil 是否支持完整的 PDB 格式

问题描述

我需要根据要注入的某些指令来跟踪源代码行。

我遵循的步骤如下:

  1. 在调试模式下构建我的项目,生成 DLL 和相应的 PDB(这些是增量 PDB,没有所有方法的序列点信息)

  2. 将 DLL 和 PDB 放在同一个文件夹中,并与 Mono.cecil 一起使用以获取序列点信息并注入指令。这适用于在 PDB 中具有序列点信息的方法

  3. 同样,在调试模式下构建我的项目,但这次在 csproj 文件中添加了以下代码

    <PropertyGroup>
       <DebugType>Full</DebugType>
    <PropertyGroup/>
    
    

这会生成一个完整的 PDB 文件以及 DLL

  1. 在同一文件路径中使用 DLL 和完整 PDB 时,这一次 Mono.cecil 抛出以下错误

    Mono.Cecil.Cil.SymbolNotFoundException: '找不到文件 my_file_path\abc.dll 的符号"

如何让 Mono.cecil 使用完整的 PDB 而不是增量 PDB。

提前致谢。

标签: c#.net-coreconsole-applicationcode-injectionmono.cecil

解决方案


  1. 您使用的是哪个版本的 Mono.Cecil?
  2. 您如何设置 PDB 阅读器?

至少最新(0.11.4)以下代码有效:

using Mono.Cecil;
using Mono.Cecil.Rocks;

class Program
{
    static void Main(string[] args)
    {
        var p = new ReaderParameters();
        p.ReadSymbols = true;
            
        using var x = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location, p);
        foreach(var m in x.MainModule.GetAllTypes().SelectMany(t => t.Methods).Where(m => m.DebugInformation != null && m.DebugInformation.HasSequencePoints))
        {
            foreach(var d in m.DebugInformation.GetSequencePointMapping())
            {
                System.Console.WriteLine($"{d.Key} => {d.Value.Document.Url} ({d.Value.StartLine},{d.Value.StartColumn})");
            }
        }
    }
}
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
      <DebugType>Full</DebugType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Mono.Cecil" Version="0.11.4" />
  </ItemGroup>
</Project>

推荐阅读