diff options
Diffstat (limited to 'scripts/Python/android')
| -rw-r--r-- | scripts/Python/android/host_art_bt.py | 237 | 
1 files changed, 0 insertions, 237 deletions
| diff --git a/scripts/Python/android/host_art_bt.py b/scripts/Python/android/host_art_bt.py deleted file mode 100644 index e359829fe5bd2..0000000000000 --- a/scripts/Python/android/host_art_bt.py +++ /dev/null @@ -1,237 +0,0 @@ -# Usage: -#   art/test/run-test --host --gdb [--64] [--interpreter] 004-JniTest -#   'b Java_Main_shortMethod' -#   'r' -#   'command script import host_art_bt.py' -#   'host_art_bt' - -import sys -import re - -import lldb - - -def host_art_bt(debugger, command, result, internal_dict): -    prettified_frames = [] -    lldb_frame_index = 0 -    art_frame_index = 0 -    target = debugger.GetSelectedTarget() -    process = target.GetProcess() -    thread = process.GetSelectedThread() -    while lldb_frame_index < thread.GetNumFrames(): -        frame = thread.GetFrameAtIndex(lldb_frame_index) -        if frame.GetModule() and re.match(r'JIT\(.*?\)', -                                          frame.GetModule().GetFileSpec().GetFilename()): -            # Compiled Java frame - -            # Get function/filename/lineno from symbol context -            symbol = frame.GetSymbol() -            if not symbol: -                print 'No symbol info for compiled Java frame: ', frame -                sys.exit(1) -            line_entry = frame.GetLineEntry() -            prettified_frames.append({ -                'function': symbol.GetName(), -                'file': str(line_entry.GetFileSpec()) if line_entry else None, -                'line': line_entry.GetLine() if line_entry else -1 -            }) - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    art_method_name = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) -                    if not error.Success: -                        print 'Failed to read method name' -                        sys.exit(1) -                    if art_method_name != symbol.GetName(): -                        print 'Function names in native symbol and art runtime stack do not match: ', symbol.GetName(), ' != ', art_method_name -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            lldb_frame_index = lldb_frame_index + 1 -            if lldb_frame_index < thread.GetNumFrames(): -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetModule() and re.match( -                        r'JIT\(.*?\)', frame.GetModule().GetFileSpec().GetFilename()): -                    # Another compile Java frame -                    # Don't skip; leave it to the next iteration -                    continue -                elif frame.GetSymbol() and (frame.GetSymbol().GetName() == 'art_quick_invoke_stub' or frame.GetSymbol().GetName() == 'art_quick_invoke_static_stub'): -                    # art_quick_invoke_stub / art_quick_invoke_static_stub -                    # Skip until we get past the next ArtMethod::Invoke() -                    while True: -                        lldb_frame_index = lldb_frame_index + 1 -                        if lldb_frame_index >= thread.GetNumFrames(): -                            print 'ArtMethod::Invoke not found below art_quick_invoke_stub/art_quick_invoke_static_stub' -                            sys.exit(1) -                        frame = thread.GetFrameAtIndex(lldb_frame_index) -                        if frame.GetSymbol() and frame.GetSymbol().GetName( -                        ) == 'art::mirror::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)': -                            lldb_frame_index = lldb_frame_index + 1 -                            break -                else: -                    print 'Invalid frame below compiled Java frame: ', frame -        elif frame.GetSymbol() and frame.GetSymbol().GetName() == 'art_quick_generic_jni_trampoline': -            # Interpreted JNI frame for x86_64 - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    # Get function/filename/lineno from ART runtime -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    function = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) - -                    prettified_frames.append({ -                        'function': function, -                        'file': None, -                        'line': -1 -                    }) - -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            lldb_frame_index = lldb_frame_index + 1 -            if lldb_frame_index < thread.GetNumFrames(): -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and (frame.GetSymbol().GetName() == -                                          'art_quick_invoke_stub' or frame.GetSymbol().GetName() == 'art_quick_invoke_static_stub'): -                    # art_quick_invoke_stub / art_quick_invoke_static_stub -                    # Skip until we get past the next ArtMethod::Invoke() -                    while True: -                        lldb_frame_index = lldb_frame_index + 1 -                        if lldb_frame_index >= thread.GetNumFrames(): -                            print 'ArtMethod::Invoke not found below art_quick_invoke_stub/art_quick_invoke_static_stub' -                            sys.exit(1) -                        frame = thread.GetFrameAtIndex(lldb_frame_index) -                        if frame.GetSymbol() and frame.GetSymbol().GetName( -                        ) == 'art::mirror::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)': -                            lldb_frame_index = lldb_frame_index + 1 -                            break -                else: -                    print 'Invalid frame below compiled Java frame: ', frame -        elif frame.GetSymbol() and re.search(r'art::interpreter::', frame.GetSymbol().GetName()): -            # Interpreted Java frame - -            while True: -                lldb_frame_index = lldb_frame_index + 1 -                if lldb_frame_index >= thread.GetNumFrames(): -                    print 'art::interpreter::Execute not found in interpreter frame' -                    sys.exit(1) -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and frame.GetSymbol().GetName( -                ) == 'art::interpreter::Execute(art::Thread*, art::MethodHelper&, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue)': -                    break - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    # Get function/filename/lineno from ART runtime -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    function = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) - -                    line = frame.EvaluateExpression( -                        art_stack_visitor.GetName() + -                        """.GetMethod()->GetLineNumFromDexPC(""" + -                        art_stack_visitor.GetName() + -                        """.GetDexPc(true))""").GetValueAsUnsigned() - -                    file_name = frame.EvaluateExpression( -                        art_method.GetName() + """->GetDeclaringClassSourceFile()""") -                    file_name_data = file_name.GetValueAsUnsigned() -                    file_name_size = frame.EvaluateExpression( -                        """(size_t)strlen(""" + file_name.GetName() + """)""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    file_name = process.ReadCStringFromMemory( -                        file_name_data, file_name_size + 1, error) -                    if not error.Success(): -                        print 'Failed to read source file name' -                        sys.exit(1) - -                    prettified_frames.append({ -                        'function': function, -                        'file': file_name, -                        'line': line -                    }) - -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            while True: -                lldb_frame_index = lldb_frame_index + 1 -                if lldb_frame_index >= thread.GetNumFrames(): -                    print 'Can not get past interpreter native frames' -                    sys.exit(1) -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and not re.search( -                        r'art::interpreter::', frame.GetSymbol().GetName()): -                    break -        else: -            # Other frames. Add them as-is. -            frame = thread.GetFrameAtIndex(lldb_frame_index) -            lldb_frame_index = lldb_frame_index + 1 -            if frame.GetModule(): -                module_name = frame.GetModule().GetFileSpec().GetFilename() -                if not module_name in [ -                    'libartd.so', -                    'dalvikvm32', -                    'dalvikvm64', -                        'libc.so.6']: -                    prettified_frames.append({ -                        'function': frame.GetSymbol().GetName() if frame.GetSymbol() else None, -                        'file': str(frame.GetLineEntry().GetFileSpec()) if frame.GetLineEntry() else None, -                        'line': frame.GetLineEntry().GetLine() if frame.GetLineEntry() else -1 -                    }) - -    for prettified_frame in prettified_frames: -        print prettified_frame['function'], prettified_frame['file'], prettified_frame['line'] - - -def __lldb_init_module(debugger, internal_dict): -    debugger.HandleCommand( -        'command script add -f host_art_bt.host_art_bt host_art_bt') | 
