我正在使用XBuild为Mono编译Visual Studio解决方案。这会生成程序集+ mdb文件。是否有可能在Windows上使用Visual Studio调试此程序集?使用“附加到进程”时,我无法调试,因为显示错误,表明未加载符号。
我尝试通过Mono.Cecil(AssemblyDefinition,MdbReaderProvider,PdbWriterProvider)为此程序集生成pdb文件,并通过Debug / Windows / Modules和“Load Symbol From / Symbol Path”手动加载它,它实际上加载了符号(显示在模块窗口中)但是也没有启用调试。
答案 0 :(得分:6)
当比较VS2012构建和XBuild构建之间的程序集定义时,我注意到XBuild没有生成DebuggableAttribute。如果缺少此属性,则无法使用Visual Studio 2012进行调试,即使手动加载符号也是如此。调试使用VS2012的Mono / XBuild编译的程序集需要以下步骤:
生成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});
答案 1 :(得分:4)
这可以通过一点点的努力来实现。
您需要将单mdb
个文件转换为pdb
个文件。在此之后,VS应该能够与您一起执行代码(如果您也有源代码) - 请参阅下文。
Mono.Cecil确实经常更改,因此您可能会发现API已经发生了一些变化。