diff options
author | Bernhard Urban <bernhard.urban@xamarin.com> | 2017-03-17 18:58:49 +0300 |
---|---|---|
committer | Bernhard Urban <bernhard.urban@xamarin.com> | 2017-03-18 10:45:42 +0300 |
commit | 7b114d194263525eeb393a019d87440cbafa5335 (patch) | |
tree | c506a4c474277e811e38eef73049b14805e8fdf8 /data | |
parent | 96fc5f635004494f6d063d39f38eced4e82b5151 (diff) |
[lldb] update `monobt` so it understands interpreter frames.
```
(lldb) monobt
* thread #1
* frame #0: 0x00000001001b236e mono-sgen`interp_transform_call(td=0x00007fff5fbfd080, method=0x0000000100915a90, target_method=0x0000000000000000, domain=0x000000010090b741
frame #1: 0x00000001001a1c2e mono-sgen`generate(method=0x0000000100915a90, rtm=0x000000010382ac70, is_bb_start="\x01", generic_context=0x0000000100915ad0) + 9454 at tran8
transforming TestMonoAsyncGenerics::AsyncWithAwait || frame #2: 0x000000010019f553 mono-sgen`mono_interp_transform_method(runtime_method=0x000000010382ac70, context=0x004
TestMonoAsyncGenerics::AsyncWithAwait @ 0 || frame #3: 0x000000010018a178 mono-sgen`ves_exec_method_with_context(frame=0x00007fff5fbfe290, context=0x00007fff5fbfe3a8) +9
TestMonoAsyncGenerics::Main @ 12 "pop" || frame #4: 0x000000010018b4b1 mono-sgen`ves_exec_method_with_context(frame=0x00007fff5fbfe420, context=0x00007fff5fbfe3a8) + 5081
frame #5: 0x0000000100189e43 mono-sgen`mono_interp_runtime_invoke(method=0x000000010090ce38, obj=0x0000000000000000, params=0x00007fff5fbfea40, exc=0x0000000000000000, e0
frame #6: 0x00000001000164a2 mono-sgen`mono_jit_runtime_invoke(method=0x000000010090ce38, obj=0x0000000000000000, params=0x00007fff5fbfea40, exc=0x0000000000000000, erro1
frame #7: 0x000000010038b2b5 mono-sgen`do_runtime_invoke(method=0x000000010090ce38, obj=0x0000000000000000, params=0x00007fff5fbfea40, exc=0x0000000000000000, error=0x002
frame #8: 0x0000000100384e97 mono-sgen`mono_runtime_invoke_checked(method=0x000000010090ce38, obj=0x0000000000000000, params=0x00007fff5fbfea40, error=0x00007fff5fbfeb000
frame #9: 0x000000010038f335 mono-sgen`do_exec_main_checked(method=0x000000010090ce38, args=0x00000001020003c8, error=0x00007fff5fbfeb00) + 197 at object.c:4672
frame #10: 0x000000010038dd5c mono-sgen`mono_runtime_exec_main_checked(method=0x000000010090ce38, args=0x00000001020003c8, error=0x00007fff5fbfeb00) + 76 at object.c:4773
frame #11: 0x000000010038ddbf mono-sgen`mono_runtime_run_main_checked(method=0x000000010090ce38, argc=1, argv=0x00007fff5fbfef68, error=0x00007fff5fbfeb00) + 79 at objec2
frame #12: 0x00000001000d9a33 mono-sgen`mono_jit_exec(domain=0x000000010090b740, assembly=0x0000000100913610, argc=1, argv=0x00007fff5fbfef68) + 403 at driver.c:1029
frame #13: 0x00000001000dd9da mono-sgen`main_thread_handler(user_data=0x00007fff5fbfeea0) + 538 at driver.c:1098
frame #14: 0x00000001000dc21c mono-sgen`mono_main(argc=3, argv=0x00007fff5fbfef58) + 8636 at driver.c:2163
frame #15: 0x0000000100001b9e mono-sgen`mono_main_with_options(argc=3, argv=0x00007fff5fbfef58) + 46 at main.c:45
frame #16: 0x00000001000012dd mono-sgen`main(argc=3, argv=0x00007fff5fbfef58) + 77 at main.c:338
frame #17: 0x00007fffc2e66255 libdyld.dylib`start + 1
frame #18: 0x00007fffc2e66255 libdyld.dylib`start + 1
```
Diffstat (limited to 'data')
-rw-r--r-- | data/lldb/monobt.py | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/data/lldb/monobt.py b/data/lldb/monobt.py index 0e4713816d7..8b2a973b820 100644 --- a/data/lldb/monobt.py +++ b/data/lldb/monobt.py @@ -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' |