Делает Моно.Сесил поддерживает полный формат PDB

#c# #.net-core #console-application #code-injection #mono.cecil

Вопрос:

Мне нужно отслеживать строки исходного кода, на основе которых должны быть введены определенные инструкции.

Шаги, которые я выполнил, приведены ниже:

  1. Создал свой проект в режиме отладки, который генерировал библиотеки DLL и соответствующие PDF-файлы(это были инкрементные PDF-файлы, и в них не было информации о точках последовательности всех методов).
  2. Поместил DLL и PDB в одну папку и использовал ее с Mono.cecil для получения информации о точках последовательности и ввел инструкции. Это отлично работало для методов, у которых была информация о точках последовательности в PDB
  3. Опять же, я построил свой проект в режиме отладки, но на этот раз добавил код ниже в файл csproj
     <PropertyGroup>
       <DebugType>Full</DebugType>
    <PropertyGroup/>
    
     

Это сгенерировало полный файл PDB вместе с библиотеками DLL

  1. При использовании DLL и полной PDB в одном и том же пути к файлу на этот раз Mono.cecil выдает ошибку ниже

    Моно.Исключение Cecil.Cil.SymbolNotFoundException: ‘Для файла не найден символ my_file_pathabc.dll»

Как мне заставить Mono.cecil работать с полными PDF-файлами вместо инкрементных PDF-файлов.

Заранее спасибо.

Ответ №1:

  1. Какая версия Моно.Сесил, которым ты пользуешься?
  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 amp;amp; 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>
 

Комментарии:

1. Я использую версию 0.11.4. Библиотека DLL проекта полностью независима от EXE-файла, использующего Mono.cecil, поэтому я указываю путь к файлу следующим образом: var readParams = новые параметры чтения(){ ReadSymbols = true }; var assembDef = Определение сборки. Сборка для чтения(«local_folder_pathabc.dll», readParams); Полная PDB (abc.pdb) помещается в тот же путь вместе с DLL

2. @yeshathakrar Обработка внешней сборки не должна иметь никакого значения. Я попробовал с внешним, и это сработало (т. Е. Приведенный выше код указывает последовательность на консоль). Как вы строите свои сборки? Который. Сетевая версия?