1ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen"""Test evaluating expressions repeatedly comparing lldb against gdb.""" 2ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 3ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport os, sys 4ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport unittest2 5ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport lldb 6ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenimport pexpect 7ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenfrom lldbbench import * 8ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 9ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenclass RepeatedExprsCase(BenchBase): 10ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 11ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen mydir = os.path.join("benchmarks", "expression") 12ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 13ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen def setUp(self): 14ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen BenchBase.setUp(self) 15ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.source = 'main.cpp' 16ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.line_to_break = line_number(self.source, '// Set breakpoint here.') 17ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.lldb_avg = None 18ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.gdb_avg = None 19ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.count = lldb.bmIterationCount 20ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen if self.count <= 0: 21ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.count = 100 22ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 23ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen @benchmarks_test 24ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen def test_compare_lldb_to_gdb(self): 25ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen """Test repeated expressions with lldb vs. gdb.""" 26ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.buildDefault() 27ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.exe_name = 'a.out' 28ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 29ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print 30ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.run_lldb_repeated_exprs(self.exe_name, self.count) 31ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print "lldb benchmark:", self.stopwatch 32ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.run_gdb_repeated_exprs(self.exe_name, self.count) 33ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print "gdb benchmark:", self.stopwatch 34ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg) 35ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 36ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen def run_lldb_repeated_exprs(self, exe_name, count): 37ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen exe = os.path.join(os.getcwd(), exe_name) 38ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 39ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Set self.child_prompt, which is "(lldb) ". 40ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child_prompt = '(lldb) ' 41ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen prompt = self.child_prompt 42ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 43ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # So that the child gets torn down after the test. 44ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe)) 45ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child = self.child 46ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 47ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Turn on logging for what the child sends back. 48ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen if self.TraceOn(): 49ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.logfile_read = sys.stdout 50ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 51ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 52ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break)) 53ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 54ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('run') 55ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 56ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen expr_cmd1 = 'expr ptr[j]->point.x' 57ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen expr_cmd2 = 'expr ptr[j]->point.y' 58ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 59ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Reset the stopwatch now. 60ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.stopwatch.reset() 61ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen for i in range(count): 62ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen with self.stopwatch: 63ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline(expr_cmd1) 64ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 65ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline(expr_cmd2) 66ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 67ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('process continue') 68ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 69ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 70ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('quit') 71ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen try: 72ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child.expect(pexpect.EOF) 73ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen except: 74ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen pass 75ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 76ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.lldb_avg = self.stopwatch.avg() 77ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen if self.TraceOn(): 78ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print "lldb expression benchmark:", str(self.stopwatch) 79ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child = None 80ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 81ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen def run_gdb_repeated_exprs(self, exe_name, count): 82ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen exe = os.path.join(os.getcwd(), exe_name) 83ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 84ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Set self.child_prompt, which is "(gdb) ". 85ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child_prompt = '(gdb) ' 86ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen prompt = self.child_prompt 87ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 88ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # So that the child gets torn down after the test. 89ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child = pexpect.spawn('gdb --nx %s' % exe) 90ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child = self.child 91ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 92ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Turn on logging for what the child sends back. 93ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen if self.TraceOn(): 94ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.logfile_read = sys.stdout 95ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 96ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 97ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('break %s:%d' % (self.source, self.line_to_break)) 98ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 99ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('run') 100ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 101ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen expr_cmd1 = 'print ptr[j]->point.x' 102ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen expr_cmd2 = 'print ptr[j]->point.y' 103ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 104ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen # Reset the stopwatch now. 105ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.stopwatch.reset() 106ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen for i in range(count): 107ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen with self.stopwatch: 108ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline(expr_cmd1) 109ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 110ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline(expr_cmd2) 111ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 112ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('continue') 113ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact(prompt) 114ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 115ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('quit') 116ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.expect_exact('The program is running. Exit anyway?') 117ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen child.sendline('y') 118ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen try: 119ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child.expect(pexpect.EOF) 120ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen except: 121ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen pass 122ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 123ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.gdb_avg = self.stopwatch.avg() 124ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen if self.TraceOn(): 125ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen print "gdb expression benchmark:", str(self.stopwatch) 126ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen self.child = None 127ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 128ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen 129ac56c171e65480eef97c89f92e74e42159526de4Johnny Chenif __name__ == '__main__': 130ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen import atexit 131ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen lldb.SBDebugger.Initialize() 132ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 133ac56c171e65480eef97c89f92e74e42159526de4Johnny Chen unittest2.main() 134