Можно ли отлаживать сборки, скомпилированные с помощью Mono / XBuild с помощью Visual Studio в Windows?

Я использую XBuild для компиляции решений Visual Studio для Mono. Это создает файл сборки + mdb. Есть ли возможность отладки этой сборки с помощью Visual Studio на Windows? При использовании "Присоединить к процессу" я не могу отладить, потому что отображается ошибка, что символы не загружены.

Я попытался сгенерировать файл pdb для этой сборки с помощью Mono.Cecil (AssemblyDefinition, MdbReaderProvider, PdbWriterProvider) и загрузить его вручную через Debug / Windows / Modules и "Load Symbol From / Symbol Path", который фактически загружает символы (показанные в модулях). окна), но это не позволяет отладку либо.

2 ответа

Решение

При сравнении определений сборок между сборками VS2012 и сборками XBuild я заметил, что XBuild не генерирует атрибут DebuggableAttribute. Если этот атрибут отсутствует, отладка в Visual Studio 2012 невозможна, даже если вы загружаете символы вручную. Следующие шаги необходимы для отладки сборок, скомпилированных с Mono / XBuild с VS2012:

  1. Используйте XBuild для компиляции решения
  2. Используйте Mono.Cecil для каждой сборки, которую вы хотите отладить, чтобы сгенерировать файл pdb и внедрить атрибут DebuggableAttribute (см. Код ниже).
  3. Начните с скомпилированной программы XBuild
  4. Используйте "Debug / Attach to process..." из VS2012 для отладки работающей программы

Код для генерации pdb и внедрения DebuggableAttribute:

string assemblyPath = @"HelloWorld.exe";

var assemblyDefinition = AssemblyDefinition.ReadAssembly(assemblyPath,
    new ReaderParameters() { SymbolReaderProvider = new MdbReaderProvider(), ReadSymbols = true});

CustomAttribute debuggableAttribute = newCustomAttribute(
assemblyDefinition.MainModule.Import(
    typeof(DebuggableAttribute).GetConstructor(new[] { typeof(bool), typeof(bool) })));

debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
    assemblyDefinition.MainModule.Import(typeof(bool)), true));

debuggableAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
    assemblyDefinition.MainModule.Import(typeof(bool)), true));

assemblyDefinition.CustomAttributes.Add(debuggableAttribute);

assemblyDefinition.Write(assemblyPath,
    new WriterParameters() { SymbolWriterProvider = new PdbWriterProvider(), WriteSymbols = true});

Это возможно с небольшим разовым усилием.

Вам нужно конвертировать моно mdb файлы в pdb файлы. После этого VS должен иметь возможность пошагово проходить код с вами (если у вас тоже есть исходники) - см. Ниже.

http://johnhmarks.wordpress.com/2011/01/19/getting-mono-cecil-to-rewrite-pdb-files-to-enable-debugging/

Mono.Cecil меняется довольно часто, поэтому вы можете обнаружить, что API немного изменился для этого.

Другие вопросы по тегам