2011-01-30 71 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的自己的调试器。

相关问题