8

我正在使用 XBuild 为 Mono 编译 Visual Studio 解决方案。这会生成程序集 + mdb 文件。是否有可能在 Windows 上使用 Visual Studio 调试此程序集?使用“附加到进程”时,我无法调试,因为显示未加载符号的错误。

我尝试通过 Mono.Cecil (AssemblyDefinition, MdbReaderProvider, PdbWriterProvider) 为这个程序集生成 pdb 文件,并通过 Debug / Windows / Modules 和“Load Symbol From / Symbol Path”手动加载它,它实际上加载了符号(显示在模块中windows),但这也不能启用调试。

4

2 回答 2

6

在比较 VS2012 构建和 XBuild 构建之间的程序集定义时,我注意到 XBuild 没有生成 DebuggableAttribute。如果缺少此属性,则无法使用 Visual Studio 2012 进行调试,即使您手动加载符号也是如此。使用 VS2012 调试使用 Mono / XBuild 编译的程序集需要以下步骤:

  1. 使用 XBuild 编译解决方案
  2. 对要调试的每个程序集使用 Mono.Cecil 以生成 pdb 文件并注入 DebuggableAttribute(请参见下面的代码)
  3. 从 XBuild 编译程序开始
  4. 使用 VS2012 中的“Debug / Attach to process...”来调试正在运行的程序

生成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});
于 2012-11-22T18:41:57.560 回答
4

只需一点点一次性的努力,就可以做到这一点。

您需要将单声道mdb文件转换为pdb文件。之后 VS 应该能够与您一起逐步完成代码(如果您也有源代码) - 见下文。

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

Mono.Cecil 确实经常更改,因此您可能会发现 API 对此进行了一些更改。

于 2012-11-22T07:45:49.567 回答