1515bc8c1Sserge-sans-paille#!/usr/bin/env python 252e6378fSGreg Clayton 352e6378fSGreg Clayton#---------------------------------------------------------------------- 452e6378fSGreg Clayton# Be sure to add the python path that points to the LLDB shared library. 552e6378fSGreg Clayton# On MacOSX csh, tcsh: 652e6378fSGreg Clayton# setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python 752e6378fSGreg Clayton# On MacOSX sh, bash: 852e6378fSGreg Clayton# export PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python 952e6378fSGreg Clayton#---------------------------------------------------------------------- 1052e6378fSGreg Clayton 11525cd59fSSerge Gueltonfrom __future__ import print_function 12525cd59fSSerge Guelton 1352e6378fSGreg Claytonimport optparse 1452e6378fSGreg Claytonimport os 1552e6378fSGreg Claytonimport platform 162d95f357SGreg Claytonimport re 1752e6378fSGreg Claytonimport resource 1852e6378fSGreg Claytonimport sys 19185de8eeSDavide Italianoimport subprocess 2052e6378fSGreg Claytonimport time 217b619fc1SGreg Claytonimport types 2252e6378fSGreg Clayton 2352e6378fSGreg Clayton#---------------------------------------------------------------------- 2452e6378fSGreg Clayton# Code that auto imports LLDB 2552e6378fSGreg Clayton#---------------------------------------------------------------------- 2652e6378fSGreg Claytontry: 2752e6378fSGreg Clayton # Just try for LLDB in case PYTHONPATH is already correctly setup 2852e6378fSGreg Clayton import lldb 2952e6378fSGreg Claytonexcept ImportError: 3052e6378fSGreg Clayton lldb_python_dirs = list() 3152e6378fSGreg Clayton # lldb is not in the PYTHONPATH, try some defaults for the current platform 3252e6378fSGreg Clayton platform_system = platform.system() 3352e6378fSGreg Clayton if platform_system == 'Darwin': 3452e6378fSGreg Clayton # On Darwin, try the currently selected Xcode directory 35185de8eeSDavide Italiano xcode_dir = subprocess.check_output("xcode-select --print-path", shell=True) 3652e6378fSGreg Clayton if xcode_dir: 37b9c1b51eSKate Stone lldb_python_dirs.append( 38b9c1b51eSKate Stone os.path.realpath( 39b9c1b51eSKate Stone xcode_dir + 40b9c1b51eSKate Stone '/../SharedFrameworks/LLDB.framework/Resources/Python')) 41b9c1b51eSKate Stone lldb_python_dirs.append( 42b9c1b51eSKate Stone xcode_dir + '/Library/PrivateFrameworks/LLDB.framework/Resources/Python') 43b9c1b51eSKate Stone lldb_python_dirs.append( 44b9c1b51eSKate Stone '/System/Library/PrivateFrameworks/LLDB.framework/Resources/Python') 4552e6378fSGreg Clayton success = False 4652e6378fSGreg Clayton for lldb_python_dir in lldb_python_dirs: 4752e6378fSGreg Clayton if os.path.exists(lldb_python_dir): 4852e6378fSGreg Clayton if not (sys.path.__contains__(lldb_python_dir)): 4952e6378fSGreg Clayton sys.path.append(lldb_python_dir) 5052e6378fSGreg Clayton try: 5152e6378fSGreg Clayton import lldb 5252e6378fSGreg Clayton except ImportError: 5352e6378fSGreg Clayton pass 5452e6378fSGreg Clayton else: 55525cd59fSSerge Guelton print('imported lldb from: "%s"' % (lldb_python_dir)) 5652e6378fSGreg Clayton success = True 5752e6378fSGreg Clayton break 5852e6378fSGreg Clayton if not success: 59525cd59fSSerge Guelton print("error: couldn't locate the 'lldb' module, please set PYTHONPATH correctly") 6052e6378fSGreg Clayton sys.exit(1) 6152e6378fSGreg Clayton 6252e6378fSGreg Clayton 6352e6378fSGreg Claytonclass Timer: 64b9c1b51eSKate Stone 6552e6378fSGreg Clayton def __enter__(self): 6652e6378fSGreg Clayton self.start = time.clock() 6752e6378fSGreg Clayton return self 6852e6378fSGreg Clayton 6952e6378fSGreg Clayton def __exit__(self, *args): 7052e6378fSGreg Clayton self.end = time.clock() 7152e6378fSGreg Clayton self.interval = self.end - self.start 7252e6378fSGreg Clayton 73b9c1b51eSKate Stone 747b619fc1SGreg Claytonclass Action(object): 757b619fc1SGreg Clayton """Class that encapsulates actions to take when a thread stops for a reason.""" 76b9c1b51eSKate Stone 777b619fc1SGreg Clayton def __init__(self, callback=None, callback_owner=None): 787b619fc1SGreg Clayton self.callback = callback 797b619fc1SGreg Clayton self.callback_owner = callback_owner 80b9c1b51eSKate Stone 817b619fc1SGreg Clayton def ThreadStopped(self, thread): 827b619fc1SGreg Clayton assert False, "performance.Action.ThreadStopped(self, thread) must be overridden in a subclass" 837b619fc1SGreg Clayton 84b9c1b51eSKate Stone 857b619fc1SGreg Claytonclass PlanCompleteAction (Action): 86b9c1b51eSKate Stone 877b619fc1SGreg Clayton def __init__(self, callback=None, callback_owner=None): 887b619fc1SGreg Clayton Action.__init__(self, callback, callback_owner) 89b9c1b51eSKate Stone 907b619fc1SGreg Clayton def ThreadStopped(self, thread): 917b619fc1SGreg Clayton if thread.GetStopReason() == lldb.eStopReasonPlanComplete: 927b619fc1SGreg Clayton if self.callback: 937b619fc1SGreg Clayton if self.callback_owner: 947b619fc1SGreg Clayton self.callback(self.callback_owner, thread) 957b619fc1SGreg Clayton else: 967b619fc1SGreg Clayton self.callback(thread) 977b619fc1SGreg Clayton return True 987b619fc1SGreg Clayton return False 997b619fc1SGreg Clayton 1007b619fc1SGreg Clayton 1017b619fc1SGreg Claytonclass BreakpointAction (Action): 102b9c1b51eSKate Stone 103b9c1b51eSKate Stone def __init__( 104b9c1b51eSKate Stone self, 105b9c1b51eSKate Stone callback=None, 106b9c1b51eSKate Stone callback_owner=None, 107b9c1b51eSKate Stone name=None, 108b9c1b51eSKate Stone module=None, 109b9c1b51eSKate Stone file=None, 110b9c1b51eSKate Stone line=None, 111b9c1b51eSKate Stone breakpoint=None): 1127b619fc1SGreg Clayton Action.__init__(self, callback, callback_owner) 1137b619fc1SGreg Clayton self.modules = lldb.SBFileSpecList() 1147b619fc1SGreg Clayton self.files = lldb.SBFileSpecList() 1157b619fc1SGreg Clayton self.breakpoints = list() 1167b619fc1SGreg Clayton # "module" can be a list or a string 1177b619fc1SGreg Clayton if breakpoint: 1187b619fc1SGreg Clayton self.breakpoints.append(breakpoint) 1197b619fc1SGreg Clayton else: 1207b619fc1SGreg Clayton if module: 1217b619fc1SGreg Clayton if isinstance(module, types.ListType): 1227b619fc1SGreg Clayton for module_path in module: 123b9c1b51eSKate Stone self.modules.Append( 124b9c1b51eSKate Stone lldb.SBFileSpec(module_path, False)) 1257b619fc1SGreg Clayton elif isinstance(module, types.StringTypes): 1267b619fc1SGreg Clayton self.modules.Append(lldb.SBFileSpec(module, False)) 1277b619fc1SGreg Clayton if name: 1287b619fc1SGreg Clayton # "file" can be a list or a string 1297b619fc1SGreg Clayton if file: 1307b619fc1SGreg Clayton if isinstance(file, types.ListType): 1317b619fc1SGreg Clayton self.files = lldb.SBFileSpecList() 1327b619fc1SGreg Clayton for f in file: 1337b619fc1SGreg Clayton self.files.Append(lldb.SBFileSpec(f, False)) 1347b619fc1SGreg Clayton elif isinstance(file, types.StringTypes): 1357b619fc1SGreg Clayton self.files.Append(lldb.SBFileSpec(file, False)) 136b9c1b51eSKate Stone self.breakpoints.append( 137b9c1b51eSKate Stone self.target.BreakpointCreateByName( 138b9c1b51eSKate Stone name, self.modules, self.files)) 1397b619fc1SGreg Clayton elif file and line: 140b9c1b51eSKate Stone self.breakpoints.append( 141b9c1b51eSKate Stone self.target.BreakpointCreateByLocation( 142b9c1b51eSKate Stone file, line)) 143b9c1b51eSKate Stone 1447b619fc1SGreg Clayton def ThreadStopped(self, thread): 1457b619fc1SGreg Clayton if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 1467b619fc1SGreg Clayton for bp in self.breakpoints: 1477b619fc1SGreg Clayton if bp.GetID() == thread.GetStopReasonDataAtIndex(0): 1487b619fc1SGreg Clayton if self.callback: 1497b619fc1SGreg Clayton if self.callback_owner: 1507b619fc1SGreg Clayton self.callback(self.callback_owner, thread) 1517b619fc1SGreg Clayton else: 1527b619fc1SGreg Clayton self.callback(thread) 1537b619fc1SGreg Clayton return True 1547b619fc1SGreg Clayton return False 155b9c1b51eSKate Stone 156b9c1b51eSKate Stone 15752e6378fSGreg Claytonclass TestCase: 15852e6378fSGreg Clayton """Class that aids in running performance tests.""" 159b9c1b51eSKate Stone 16052e6378fSGreg Clayton def __init__(self): 16152e6378fSGreg Clayton self.verbose = False 16252e6378fSGreg Clayton self.debugger = lldb.SBDebugger.Create() 16352e6378fSGreg Clayton self.target = None 16452e6378fSGreg Clayton self.process = None 16552e6378fSGreg Clayton self.thread = None 16652e6378fSGreg Clayton self.launch_info = None 1677b619fc1SGreg Clayton self.done = False 16852e6378fSGreg Clayton self.listener = self.debugger.GetListener() 1697b619fc1SGreg Clayton self.user_actions = list() 1707b619fc1SGreg Clayton self.builtin_actions = list() 1717b619fc1SGreg Clayton self.bp_id_to_dict = dict() 17252e6378fSGreg Clayton 17352e6378fSGreg Clayton def Setup(self, args): 17452e6378fSGreg Clayton self.launch_info = lldb.SBLaunchInfo(args) 17552e6378fSGreg Clayton 17652e6378fSGreg Clayton def Run(self, args): 1777b619fc1SGreg Clayton assert False, "performance.TestCase.Run(self, args) must be subclassed" 17852e6378fSGreg Clayton 17952e6378fSGreg Clayton def Launch(self): 18052e6378fSGreg Clayton if self.target: 18152e6378fSGreg Clayton error = lldb.SBError() 1827b619fc1SGreg Clayton self.process = self.target.Launch(self.launch_info, error) 18352e6378fSGreg Clayton if not error.Success(): 184525cd59fSSerge Guelton print("error: %s" % error.GetCString()) 18552e6378fSGreg Clayton if self.process: 186b9c1b51eSKate Stone self.process.GetBroadcaster().AddListener(self.listener, 187b9c1b51eSKate Stone lldb.SBProcess.eBroadcastBitStateChanged | lldb.SBProcess.eBroadcastBitInterrupt) 18852e6378fSGreg Clayton return True 18952e6378fSGreg Clayton return False 19052e6378fSGreg Clayton 19152e6378fSGreg Clayton def WaitForNextProcessEvent(self): 19252e6378fSGreg Clayton event = None 19352e6378fSGreg Clayton if self.process: 19452e6378fSGreg Clayton while event is None: 19552e6378fSGreg Clayton process_event = lldb.SBEvent() 19652e6378fSGreg Clayton if self.listener.WaitForEvent(lldb.UINT32_MAX, process_event): 19752e6378fSGreg Clayton state = lldb.SBProcess.GetStateFromEvent(process_event) 19852e6378fSGreg Clayton if self.verbose: 199525cd59fSSerge Guelton print("event = %s" % (lldb.SBDebugger.StateAsCString(state))) 20052e6378fSGreg Clayton if lldb.SBProcess.GetRestartedFromEvent(process_event): 20152e6378fSGreg Clayton continue 20252e6378fSGreg Clayton if state == lldb.eStateInvalid or state == lldb.eStateDetached or state == lldb.eStateCrashed or state == lldb.eStateUnloaded or state == lldb.eStateExited: 20352e6378fSGreg Clayton event = process_event 2047b619fc1SGreg Clayton self.done = True 20552e6378fSGreg Clayton elif state == lldb.eStateConnected or state == lldb.eStateAttaching or state == lldb.eStateLaunching or state == lldb.eStateRunning or state == lldb.eStateStepping or state == lldb.eStateSuspended: 20652e6378fSGreg Clayton continue 20752e6378fSGreg Clayton elif state == lldb.eStateStopped: 20852e6378fSGreg Clayton event = process_event 20952e6378fSGreg Clayton call_test_step = True 21052e6378fSGreg Clayton fatal = False 21152e6378fSGreg Clayton selected_thread = False 21252e6378fSGreg Clayton for thread in self.process: 21352e6378fSGreg Clayton frame = thread.GetFrameAtIndex(0) 21452e6378fSGreg Clayton select_thread = False 2157b619fc1SGreg Clayton 2167b619fc1SGreg Clayton stop_reason = thread.GetStopReason() 21752e6378fSGreg Clayton if self.verbose: 218525cd59fSSerge Guelton print("tid = %#x pc = %#x " % (thread.GetThreadID(), frame.GetPC()), end=' ') 21952e6378fSGreg Clayton if stop_reason == lldb.eStopReasonNone: 22052e6378fSGreg Clayton if self.verbose: 221525cd59fSSerge Guelton print("none") 22252e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonTrace: 22352e6378fSGreg Clayton select_thread = True 22452e6378fSGreg Clayton if self.verbose: 225525cd59fSSerge Guelton print("trace") 22652e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonPlanComplete: 22752e6378fSGreg Clayton select_thread = True 22852e6378fSGreg Clayton if self.verbose: 229525cd59fSSerge Guelton print("plan complete") 23052e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonThreadExiting: 23152e6378fSGreg Clayton if self.verbose: 232525cd59fSSerge Guelton print("thread exiting") 23352e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonExec: 23452e6378fSGreg Clayton if self.verbose: 235525cd59fSSerge Guelton print("exec") 23652e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonInvalid: 23752e6378fSGreg Clayton if self.verbose: 238525cd59fSSerge Guelton print("invalid") 23952e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonException: 24052e6378fSGreg Clayton select_thread = True 24152e6378fSGreg Clayton if self.verbose: 242525cd59fSSerge Guelton print("exception") 24352e6378fSGreg Clayton fatal = True 24452e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonBreakpoint: 24552e6378fSGreg Clayton select_thread = True 2467b619fc1SGreg Clayton bp_id = thread.GetStopReasonDataAtIndex(0) 2477b619fc1SGreg Clayton bp_loc_id = thread.GetStopReasonDataAtIndex(1) 24852e6378fSGreg Clayton if self.verbose: 249525cd59fSSerge Guelton print("breakpoint id = %d.%d" % (bp_id, bp_loc_id)) 25052e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonWatchpoint: 25152e6378fSGreg Clayton select_thread = True 25252e6378fSGreg Clayton if self.verbose: 253525cd59fSSerge Guelton print("watchpoint id = %d" % (thread.GetStopReasonDataAtIndex(0))) 25452e6378fSGreg Clayton elif stop_reason == lldb.eStopReasonSignal: 25552e6378fSGreg Clayton select_thread = True 25652e6378fSGreg Clayton if self.verbose: 257525cd59fSSerge Guelton print("signal %d" % (thread.GetStopReasonDataAtIndex(0))) 258*6c37984eSMichał Górny elif stop_reason == lldb.eStopReasonFork: 259*6c37984eSMichał Górny if self.verbose: 260*6c37984eSMichał Górny print("fork pid = %d" % (thread.GetStopReasonDataAtIndex(0))) 261*6c37984eSMichał Górny elif stop_reason == lldb.eStopReasonVFork: 262*6c37984eSMichał Górny if self.verbose: 263*6c37984eSMichał Górny print("vfork pid = %d" % (thread.GetStopReasonDataAtIndex(0))) 264*6c37984eSMichał Górny elif stop_reason == lldb.eStopReasonVForkDone: 265*6c37984eSMichał Górny if self.verbose: 266*6c37984eSMichał Górny print("vfork done") 26752e6378fSGreg Clayton 26852e6378fSGreg Clayton if select_thread and not selected_thread: 2697b619fc1SGreg Clayton self.thread = thread 270b9c1b51eSKate Stone selected_thread = self.process.SetSelectedThread( 271b9c1b51eSKate Stone thread) 2727b619fc1SGreg Clayton 2737b619fc1SGreg Clayton for action in self.user_actions: 2747b619fc1SGreg Clayton action.ThreadStopped(thread) 2757b619fc1SGreg Clayton 27652e6378fSGreg Clayton if fatal: 27752e6378fSGreg Clayton # if self.verbose: 2787b619fc1SGreg Clayton # Xcode.RunCommand(self.debugger,"bt all",true) 2797b619fc1SGreg Clayton sys.exit(1) 28052e6378fSGreg Clayton return event 28152e6378fSGreg Clayton 282b9c1b51eSKate Stone 2832d95f357SGreg Claytonclass Measurement: 2842d95f357SGreg Clayton '''A class that encapsulates a measurement''' 285b9c1b51eSKate Stone 2867b619fc1SGreg Clayton def __init__(self): 2877b619fc1SGreg Clayton object.__init__(self) 288b9c1b51eSKate Stone 2892d95f357SGreg Clayton def Measure(self): 2902d95f357SGreg Clayton assert False, "performance.Measurement.Measure() must be subclassed" 2912d95f357SGreg Clayton 292b9c1b51eSKate Stone 2932d95f357SGreg Claytonclass MemoryMeasurement(Measurement): 2942d95f357SGreg Clayton '''A class that can measure memory statistics for a process.''' 295b9c1b51eSKate Stone 2962d95f357SGreg Clayton def __init__(self, pid): 2977b619fc1SGreg Clayton Measurement.__init__(self) 2982d95f357SGreg Clayton self.pid = pid 299b9c1b51eSKate Stone self.stats = [ 300b9c1b51eSKate Stone "rprvt", 301b9c1b51eSKate Stone "rshrd", 302b9c1b51eSKate Stone "rsize", 303b9c1b51eSKate Stone "vsize", 304b9c1b51eSKate Stone "vprvt", 305b9c1b51eSKate Stone "kprvt", 306b9c1b51eSKate Stone "kshrd", 307b9c1b51eSKate Stone "faults", 308b9c1b51eSKate Stone "cow", 309b9c1b51eSKate Stone "pageins"] 310b9c1b51eSKate Stone self.command = "top -l 1 -pid %u -stats %s" % ( 311b9c1b51eSKate Stone self.pid, ",".join(self.stats)) 3122d95f357SGreg Clayton self.value = dict() 3132d95f357SGreg Clayton 3142d95f357SGreg Clayton def Measure(self): 3151a12dd70SSerge Guelton output = subprocess.getoutput(self.command).split("\n")[-1] 3162d95f357SGreg Clayton values = re.split('[-+\s]+', output) 3172d95f357SGreg Clayton for (idx, stat) in enumerate(values): 3182d95f357SGreg Clayton multiplier = 1 3192d95f357SGreg Clayton if stat: 3202d95f357SGreg Clayton if stat[-1] == 'K': 3217b619fc1SGreg Clayton multiplier = 1024 3222d95f357SGreg Clayton stat = stat[:-1] 3232d95f357SGreg Clayton elif stat[-1] == 'M': 3247b619fc1SGreg Clayton multiplier = 1024 * 1024 3252d95f357SGreg Clayton stat = stat[:-1] 3262d95f357SGreg Clayton elif stat[-1] == 'G': 3277b619fc1SGreg Clayton multiplier = 1024 * 1024 * 1024 3282d95f357SGreg Clayton elif stat[-1] == 'T': 3297b619fc1SGreg Clayton multiplier = 1024 * 1024 * 1024 * 1024 3302d95f357SGreg Clayton stat = stat[:-1] 3312d95f357SGreg Clayton self.value[self.stats[idx]] = int(stat) * multiplier 3322d95f357SGreg Clayton 3332d95f357SGreg Clayton def __str__(self): 3342d95f357SGreg Clayton '''Dump the MemoryMeasurement current value''' 3352d95f357SGreg Clayton s = '' 3362d95f357SGreg Clayton for key in self.value.keys(): 3372d95f357SGreg Clayton if s: 3382d95f357SGreg Clayton s += "\n" 3392d95f357SGreg Clayton s += "%8s = %s" % (key, self.value[key]) 3402d95f357SGreg Clayton return s 3412d95f357SGreg Clayton 34252e6378fSGreg Clayton 34352e6378fSGreg Claytonclass TesterTestCase(TestCase): 344b9c1b51eSKate Stone 3457b619fc1SGreg Clayton def __init__(self): 3467b619fc1SGreg Clayton TestCase.__init__(self) 3477b619fc1SGreg Clayton self.verbose = True 3487b619fc1SGreg Clayton self.num_steps = 5 3497b619fc1SGreg Clayton 3507b619fc1SGreg Clayton def BreakpointHit(self, thread): 3517b619fc1SGreg Clayton bp_id = thread.GetStopReasonDataAtIndex(0) 3527b619fc1SGreg Clayton loc_id = thread.GetStopReasonDataAtIndex(1) 353525cd59fSSerge Guelton print("Breakpoint %i.%i hit: %s" % (bp_id, loc_id, thread.process.target.FindBreakpointByID(bp_id))) 3547b619fc1SGreg Clayton thread.StepOver() 3557b619fc1SGreg Clayton 3567b619fc1SGreg Clayton def PlanComplete(self, thread): 3577b619fc1SGreg Clayton if self.num_steps > 0: 3587b619fc1SGreg Clayton thread.StepOver() 3597b619fc1SGreg Clayton self.num_steps = self.num_steps - 1 3607b619fc1SGreg Clayton else: 3617b619fc1SGreg Clayton thread.process.Kill() 36252e6378fSGreg Clayton 36352e6378fSGreg Clayton def Run(self, args): 36452e6378fSGreg Clayton self.Setup(args) 3652d95f357SGreg Clayton with Timer() as total_time: 36652e6378fSGreg Clayton self.target = self.debugger.CreateTarget(args[0]) 36752e6378fSGreg Clayton if self.target: 36852e6378fSGreg Clayton with Timer() as breakpoint_timer: 3697b619fc1SGreg Clayton bp = self.target.BreakpointCreateByName("main") 370b9c1b51eSKate Stone print( 371b9c1b51eSKate Stone 'Breakpoint time = %.03f sec.' % 372b9c1b51eSKate Stone breakpoint_timer.interval) 3737b619fc1SGreg Clayton 374b9c1b51eSKate Stone self.user_actions.append( 375b9c1b51eSKate Stone BreakpointAction( 376b9c1b51eSKate Stone breakpoint=bp, 377b9c1b51eSKate Stone callback=TesterTestCase.BreakpointHit, 378b9c1b51eSKate Stone callback_owner=self)) 379b9c1b51eSKate Stone self.user_actions.append( 380b9c1b51eSKate Stone PlanCompleteAction( 381b9c1b51eSKate Stone callback=TesterTestCase.PlanComplete, 382b9c1b51eSKate Stone callback_owner=self)) 3837b619fc1SGreg Clayton 3842d95f357SGreg Clayton if self.Launch(): 3857b619fc1SGreg Clayton while not self.done: 3867b619fc1SGreg Clayton self.WaitForNextProcessEvent() 38752e6378fSGreg Clayton else: 388525cd59fSSerge Guelton print("error: failed to launch process") 38952e6378fSGreg Clayton else: 390525cd59fSSerge Guelton print("error: failed to create target with '%s'" % (args[0])) 3912d95f357SGreg Clayton print('Total time = %.03f sec.' % total_time.interval) 3922d95f357SGreg Clayton 39352e6378fSGreg Clayton 39452e6378fSGreg Claytonif __name__ == '__main__': 39552e6378fSGreg Clayton lldb.SBDebugger.Initialize() 39652e6378fSGreg Clayton test = TesterTestCase() 39752e6378fSGreg Clayton test.Run(sys.argv[1:]) 3982d95f357SGreg Clayton mem = MemoryMeasurement(os.getpid()) 3992d95f357SGreg Clayton mem.Measure() 400525cd59fSSerge Guelton print(str(mem)) 40152e6378fSGreg Clayton lldb.SBDebugger.Terminate() 4022d95f357SGreg Clayton # print "sleeeping for 100 seconds" 4032d95f357SGreg Clayton # time.sleep(100) 404