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