2011-01-30 4 views
0

내 프로그램에 Mono가 포함되어 있습니다. 응용 프로그램의 대부분은 C++로 작성되었습니다. 경우에 따라 응용 프로그램에 Mono JIT가 일부 어셈블리 코드를 컴파일하고 생성 된 코드가 실행됩니다.Visual Studio 디버거에 추가 기호를 알릴 수 있습니까?

동적으로 생성 된 함수가 호출 스택에있는 동안 디버거를 중단 할 때 동적으로 생성 된 어셈블리 함수에 대한 설명이 포함 된 이름을 표시하여 Visual Studio 디버거를 좀 더 유용하게 만들고 싶습니다.

디버거에 "0x78f0000에서 0x78f0300까지의 헤이가 SomeClass :: SomeMethodInAHighLevelLanguage()"어셈블리 구현을 작성했는지 알 수 있습니까?

답변

1

하나의 가능성은 내가이 과거에 모노 작업 얻는 노력

http://msdn.microsoft.com/en-us/library/ff537943(v=vs.85).aspx

자신의 디버그 확장을 작성하는 경우 합성 기호 것 같다,하지만 많은 행운이 없었다. 디버그 엔진에서 IDebugSymbols3 인터페이스를 가져올 수 없지만 그 부분은 오류 일 수 있습니다. 디버그 확장에서 해당 인터페이스를 실제로 검색 할 수 있다고 가정하면 AddSyntheticSymbol을 통해 jitted 메서드를 등록하는 것이 좋습니다.

또 다른 옵션은 모노 내에서 파일을 .DBG 생성 될 수 있으며 (GDB에 대한 Xdebug는 유사) 디버거에 그 문자로드 :

http://www.microsoft.com/msj/0399/hood/hood0399.aspx

업데이트

다음 매크로 의지 mono에서 managed 심볼까지의 혼합 된 콜 스택을 모노에서 명령 창으로 출력합니다.

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports EnvDTE90a 
Imports EnvDTE100 
Imports System.Diagnostics 

Public Module Module1 

    Sub PrintStackTrace() 

     If DTE.Debugger.CurrentProgram Is Nothing Then 
      DTE.StatusBar.Text = "No program is currently being debugged." 
      Exit Sub 
     End If 

     For index = 1 To DTE.Debugger.CurrentThread.StackFrames.Count 
      Dim frame = DTE.Debugger.CurrentThread.StackFrames.Item(index) 
      Try 
       Dim funcAddr = CLng("&h" & frame.FunctionName) 
       Dim statement As String 
       statement = "{,,mono.dll}mono_pmip((void*)" & funcAddr & ")" 
       DTE.Debugger.ExecuteStatement(statement, 100, False) 
      Catch E As Exception 
       Dim win = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindCommandWindow) 
       win.Object.OutputString(frame.FunctionName & vbCrLf) 
      End Try 
     Next 

    End Sub 

End Module 
0

글쎄, 당신이 할 수없는 무언가로 Visual Studio에 도전하라.

Microsoft .NET 응용 프로그램의 경우 Microsoft에서 .NET을 디버깅하는 방법을 알고 있으므로 sos.dll 확장명을 사용할 수 있습니다.

C++ 응용 프로그램에서 Mono 런타임을 호스트하는 경우 개인적으로 sos.dll은 쓸모가 없으며 Mono의 자체 디버거를 사용해야 할 수도 있습니다.

관련 문제