微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mono.Cecil 是否支持完整的 PDB 格式

如何解决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。

提前致谢。

解决方法

  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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。