[lldb] update `monobt` so it understands interpreter frames.
[mono.git] / data / lldb / monobt.py
index 0e4713816d742ad79cccd869b4911d8687fbec2f..8b2a973b820138931ef25784bf0f5671444c7304 100644 (file)
@@ -9,16 +9,38 @@ def print_frames(thread, num_frames, current_thread):
 
     for frame in thread.frames[:+num_frames]:
         pc = str(frame.addr)
-        fmt = '  %c %s'
         var = frame
-        if pc[0] == '0':
+        function_name = frame.GetFunctionName()
+        if function_name == "ves_exec_method_with_context":
+            try:
+                s = 'frame->runtime_method->method'
+                klassname = frame.EvaluateExpression('(char*) ' + s + '->klass->name').summary[1:-1]
+                methodname = frame.EvaluateExpression('(char*) ' + s + '->name').summary[1:-1]
+
+                ipoffset = frame.EvaluateExpression('ip').GetValueAsUnsigned()
+                insn = ''
+                if ipoffset != 0:
+                    ipoffset -= frame.EvaluateExpression('rtm->code').GetValueAsUnsigned()
+                    insn = "\"" + frame.EvaluateExpression('mono_interp_opname [*ip]').summary[1:-1] + "\""
+                var = '%s::%s @ %d %s || %s' % (klassname, methodname, ipoffset, insn, frame)
+            except Exception as e:
+                print "DBG: execfail:" + str(e)
+        elif function_name == "mono_interp_transform_method":
+            try:
+                s = 'runtime_method->method'
+                klassname = frame.EvaluateExpression('(char*) ' + s + '->klass->name').summary[1:-1]
+                methodname = frame.EvaluateExpression('(char*) ' + s + '->name').summary[1:-1]
+                var = 'transforming %s::%s || %s' % (klassname, methodname, frame)
+            except Exception as e:
+                print "DBG: transformfail:" + str(e)
+        elif pc[0] == '0':
             try:
                 framestr = frame.EvaluateExpression('(char*)mono_pmip((void*)%s)' % pc).summary[1:-1]
                 var = 'frame #%i: %s%s' % (frame.idx, pc, framestr)
             except:
                 pass
 
-        print fmt % ('*' if current_thread and frame.idx == selected_frame.idx else ' ', var)
+        print '  %c %s' % ('*' if current_thread and frame.idx == selected_frame.idx else ' ', var)
 
 def monobt(debugger, command, result, dict):
     opts = {'all_bt': False, 'num_frames': None}
@@ -53,4 +75,5 @@ def __lldb_init_module (debugger, dict):
     # This initializer is being run from LLDB in the embedded command interpreter
     # Add any commands contained in this module to LLDB
     debugger.HandleCommand('command script add -f monobt.monobt monobt')
-    print '"monobt" command installed'
\ No newline at end of file
+    debugger.HandleCommand('command alias mbt monobt')
+    print '"monobt" command installed'