2011-01-30 69 views
0

我的程序嵌入單。大部分的應用程序都在我寫的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文件和那些符號加載到調試器(類似於Xdebug的用於GDB):

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

更新

下面的宏意願輸出本機和託管符號的混合調用堆棧從單聲道到命令窗口:

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應用程序,可以爲微軟知道如何調試.NET使用sos.dll擴展。

如果單主機運行在C++應用程序,那麼我個人認爲sos.dll是無用的,你可能需要使用Mono的自己的調試器。

相關問題