我的程序嵌入了Mono。应用程序的大部分内容都是我写的c ++。有时,应用程序让Mono JIT编译一些汇编代码,并生成代码。
当在动态生成的函数在callstack上时打破调试器时,我想通过显示这些动态生成的汇编函数的描述性名称来使visual studio调试器更有用。
有没有办法告诉调试器:“嘿,从0x78f0000到0x78f0300,我为SomeClass编写了程序集实现:: SomeMethodInAHighLevelLanguage()”?
答案 0 :(得分:1)
如果你编写自己的调试扩展
,一种可能性似乎是Synthetic Symbolshttp://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自己的调试器。