我可以通知Visual Studio调试器其他符号吗?

时间:2011-01-30 19:54:47

标签: visual-studio mono debugging

我的程序嵌入了Mono。应用程序的大部分内容都是我写的c ++。有时,应用程序让Mono JIT编译一些汇编代码,并生成代码。

当在动态生成的函数在callstack上时打破调试器时,我想通过显示这些动态生成的汇编函数的描述性名称来使visual studio调试器更有用。

有没有办法告诉调试器:“嘿,从0x78f0000到0x78f0300,我为SomeClass编写了程序集实现:: SomeMethodInAHighLevelLanguage()”?

2 个答案:

答案 0 :(得分:1)

如果你编写自己的调试扩展

,一种可能性似乎是Synthetic Symbols

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

我过去尝试过使用mono,但没有太多运气。我无法从调试引擎获取IDebugSymbols3接口,但这可能是我的错误。假设您实际上可以从调试扩展中检索该接口,那么我们的想法是通过AddSyntheticSymbol注册jitted方法。

另一种选择可能是从mono中生成.dbg文件并将这些符号加载到调试器中(类似于gdb的xdebug):

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

更新

以下宏将从单声道输出本机和托管符号的混合callstack到命令窗口:

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

答案 1 :(得分:0)

好吧,你用一些它可能永远无法做到的东西挑战Visual Studio。

对于Microsoft .NET应用程序,可以使用sos.dll扩展,因为Microsoft知道如何调试.NET。

如果你在C ++应用程序中托管Mono运行时,那么我个人认为sos.dll没用,你可能不得不使用Mono自己的调试器。