Можно ли отлаживать сборки, скомпилированные с помощью 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:
- Используйте XBuild для компиляции решения
- Используйте Mono.Cecil для каждой сборки, которую вы хотите отладить, чтобы сгенерировать файл pdb и внедрить атрибут DebuggableAttribute (см. Код ниже).
- Начните с скомпилированной программы XBuild
- Используйте "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 должен иметь возможность пошагово проходить код с вами (если у вас тоже есть исходники) - см. Ниже.
Mono.Cecil меняется довольно часто, поэтому вы можете обнаружить, что API немного изменился для этого.