Home | History | Annotate | Download | only in turnaround
      1 """Benchmark the turnaround time starting a debugger and run to the breakpont with lldb vs. gdb."""
      2 
      3 import os, sys
      4 import unittest2
      5 import lldb
      6 import pexpect
      7 from lldbbench import *
      8 
      9 class CompileRunToBreakpointBench(BenchBase):
     10 
     11     mydir = os.path.join("benchmarks", "turnaround")
     12 
     13     def setUp(self):
     14         BenchBase.setUp(self)
     15         self.exe = self.lldbHere
     16         self.function = 'Driver::MainLoop()'
     17 
     18         self.count = lldb.bmIterationCount
     19         if self.count <= 0:
     20             self.count = 3
     21 
     22         self.lldb_avg = None
     23         self.gdb_avg = None
     24 
     25     @benchmarks_test
     26     def test_run_lldb_then_gdb(self):
     27         """Benchmark turnaround time with lldb vs. gdb."""
     28         print
     29         self.run_lldb_turnaround(self.exe, self.function, self.count)
     30         print "lldb turnaround benchmark:", self.stopwatch
     31         self.run_gdb_turnaround(self.exe, self.function, self.count)
     32         print "gdb turnaround benchmark:", self.stopwatch
     33         print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg)
     34 
     35     def run_lldb_turnaround(self, exe, function, count):
     36         def run_one_round():
     37             prompt = self.child_prompt
     38 
     39             # So that the child gets torn down after the test.
     40             self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe))
     41             child = self.child
     42 
     43             # Turn on logging for what the child sends back.
     44             if self.TraceOn():
     45                 child.logfile_read = sys.stdout
     46 
     47             child.expect_exact(prompt)
     48             child.sendline('breakpoint set -F %s' % function)
     49             child.expect_exact(prompt)
     50             child.sendline('run')
     51             child.expect_exact(prompt)
     52 
     53         # Set self.child_prompt, which is "(lldb) ".
     54         self.child_prompt = '(lldb) '
     55         # Reset the stopwatch now.
     56         self.stopwatch.reset()
     57 
     58         for i in range(count + 1):
     59             # Ignore the first invoke lldb and run to the breakpoint turnaround time.
     60             if i == 0:
     61                 run_one_round()
     62             else:
     63                 with self.stopwatch:
     64                     run_one_round()
     65 
     66             self.child.sendline('quit')
     67             try:
     68                 self.child.expect(pexpect.EOF)
     69             except:
     70                 pass
     71 
     72         self.lldb_avg = self.stopwatch.avg()
     73         self.child = None
     74 
     75     def run_gdb_turnaround(self, exe, function, count):
     76         def run_one_round():
     77             prompt = self.child_prompt
     78 
     79             # So that the child gets torn down after the test.
     80             self.child = pexpect.spawn('gdb --nx %s' % exe)
     81             child = self.child
     82 
     83             # Turn on logging for what the child sends back.
     84             if self.TraceOn():
     85                 child.logfile_read = sys.stdout
     86 
     87             child.expect_exact(prompt)
     88             child.sendline('break %s' % function)
     89             child.expect_exact(prompt)
     90             child.sendline('run')
     91             child.expect_exact(prompt)
     92 
     93         # Set self.child_prompt, which is "(gdb) ".
     94         self.child_prompt = '(gdb) '
     95         # Reset the stopwatch now.
     96         self.stopwatch.reset()
     97 
     98         for i in range(count+1):
     99             # Ignore the first invoke lldb and run to the breakpoint turnaround time.
    100             if i == 0:
    101                 run_one_round()
    102             else:
    103                 with self.stopwatch:
    104                     run_one_round()
    105 
    106             self.child.sendline('quit')
    107             self.child.expect_exact('The program is running.  Exit anyway?')
    108             self.child.sendline('y')
    109             try:
    110                 self.child.expect(pexpect.EOF)
    111             except:
    112                 pass
    113 
    114         self.gdb_avg = self.stopwatch.avg()
    115         self.child = None
    116 
    117 
    118 if __name__ == '__main__':
    119     import atexit
    120     lldb.SBDebugger.Initialize()
    121     atexit.register(lambda: lldb.SBDebugger.Terminate())
    122     unittest2.main()
    123