2012-11-21 5 views
8

저는 XBuild를 사용하여 Mono 용 Visual Studio 솔루션을 컴파일하고 있습니다. 그러면 assembly + mdb 파일이 생성됩니다. Windows에서 Visual Studio로이 어셈블리를 디버깅 할 수 있습니까? "Attach to process"를 사용하면 기호가로드되지 않는다는 오류가 표시되어 디버그 할 수 없습니다.Windows에서 Visual Studio를 사용하여 Mono/XBuild로 컴파일 된 어셈블리를 디버깅 할 수 있습니까?

Mono.Cecil (AssemblyDefinition, MdbReaderProvider, PdbWriterProvider)을 통해이 어셈블리의 pdb 파일을 생성하고 디버그/Windows/모듈 및 "Load Symbol From/Symbol Path"를 통해 수동으로로드하여 실제로 심볼을로드합니다. Modules 창에 표시)하지만 디버깅을 활성화하지는 않습니다.

+1

나는 이것이 가능하다고 믿지 않습니다. (하지만 잘못 알고 싶습니다.) –

+1

몇 년 전 모노의'.mdb' 파일 형식을 만들었을 때, PDB는 문서화되지 않았고 독점적 이었기 때문에 단지 그것을 사용할 수 없었습니다. 그리고 AFAIK, 이것은 오늘날에도 여전히 사실입니다 (적어도 Wikipedia는 그렇게 말합니다). 이 파일을 작성하는 데는 몇 가지 도구가있을 수 있지만 Microsoft에서 작성했거나 파일 형식을 게시하지 않는 한 완전히 "올바른"PDB를 생성 할 수 없습니다. 그러나, 나는 또한 이것에 대해 잘못 입증되고 싶습니다. –

+0

참고로 반대의 경우'pdb2mdb some.dll'을 사용하여 pdb를 모노 형식으로 변환하십시오. – KCD

답변

6

VS2012 빌드와 XBuild 빌드 사이의 어셈블리 정의를 비교할 때 XBuild가 DebuggableAttribute를 생성하지 않는 것으로 나타났습니다. 이 특성이 없으면 기호를 수동으로로드하더라도 Visual Studio 2012로 디버깅 할 수 없습니다.

  1. 사용 XBuild 당신이 PDB 파일을 생성하는 디버깅하고 주입 할 각 어셈블리에 대한 솔루션을
  2. 사용 Mono.Cecil를 컴파일 : 다음 단계는 VS2012와 모노/XBuild 컴파일 디버그 어셈블리에 필요한 DebuggableAttribute를이
  3. 당신과 XBuild 컴파일 된 프로그램
  4. 사용 시작
  5. (아래 코드 참조) "프로세스에 연결/디버그를 ..."VS2012에서 generatin의 실행중인 프로그램을

코드를 디버깅 g 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}); 
4

약간의 노력만으로도 가능합니다.

모노 mdb 파일을 pdb 개의 파일로 변환해야합니다. 그 후에 VS가 코드를 단계별로 실행할 수 있어야합니다 (소스가있는 경우). 아래를 참조하십시오. 당신이 API를 찾을 수 있도록 Mono.Cecil 매우 자주 변경 않습니다

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

이를 위해 조금 변경되었습니다.

+0

질문하기 전에이 게시물을 찾았습니다. (질문의 두 번째 부분 인 AssemblyDefinition, MdbReaderProvider, PdbWriterProvider를 참조하십시오.) 어쩌면 내가 뭔가 잘못 했어 -하지만 VS 자동으로 기호를로드하지 않은 및 디버그/Windows/모듈 및 "로드 기호/기호 경로"를 통해 아무것도 수동으로로드 할 때 아무 것도 변경되지 않았습니다. 내가 집에있을 때 코드 스 니펫을 게시합니다. – Dresel

+0

또한 DebuggableAttribute를 추가해야합니다. 내 대답은 아래를 참조하십시오. – Dresel