1901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty"""Test evaluating expressions repeatedly comparing lldb against gdb.""" 2901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 3901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport os, sys 4901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport unittest2 5901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport lldb 6901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyimport pexpect 7901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyfrom lldbbench import * 8901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 9901305d0a11d86eec516bd085a39d7eafde46047Dirk Doughertyclass RepeatedExprsCase(BenchBase): 10901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 11901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty mydir = os.path.join("benchmarks", "expression") 12901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 13901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty def setUp(self): 14901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty BenchBase.setUp(self) 15901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.source = 'main.cpp' 16901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.line_to_break = line_number(self.source, '// Set breakpoint here.') 17901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.lldb_avg = None 18901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.gdb_avg = None 19901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.count = lldb.bmIterationCount 20901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty if self.count <= 0: 21901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.count = 100 22901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 23901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty @benchmarks_test 24901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty def test_compare_lldb_to_gdb(self): 25901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty """Test repeated expressions with lldb vs. gdb.""" 26901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.buildDefault() 27901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.exe_name = 'a.out' 28901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 29901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print 30901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.run_lldb_repeated_exprs(self.exe_name, self.count) 31901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print "lldb benchmark:", self.stopwatch 32901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.run_gdb_repeated_exprs(self.exe_name, self.count) 33901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print "gdb benchmark:", self.stopwatch 34901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print "lldb_avg/gdb_avg: %f" % (self.lldb_avg/self.gdb_avg) 35901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 36901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty def run_lldb_repeated_exprs(self, exe_name, count): 37901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty exe = os.path.join(os.getcwd(), exe_name) 38901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 39901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Set self.child_prompt, which is "(lldb) ". 40901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child_prompt = '(lldb) ' 41901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty prompt = self.child_prompt 42901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 43901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # So that the child gets torn down after the test. 44901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child = pexpect.spawn('%s %s %s' % (self.lldbExec, self.lldbOption, exe)) 45901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child = self.child 46901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 47901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Turn on logging for what the child sends back. 48901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty if self.TraceOn(): 49901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.logfile_read = sys.stdout 50901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 51901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 52901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('breakpoint set -f %s -l %d' % (self.source, self.line_to_break)) 53901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 54901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('run') 55901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 56901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty expr_cmd1 = 'expr ptr[j]->point.x' 570a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty expr_cmd2 = 'expr ptr[j]->point.y' 58901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 59901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Reset the stopwatch now. 60901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.stopwatch.reset() 61901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty for i in range(count): 62901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty with self.stopwatch: 63901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline(expr_cmd1) 64901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 65901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline(expr_cmd2) 66901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 67901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('process continue') 68901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 69901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 700a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty child.sendline('quit') 71901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty try: 72901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child.expect(pexpect.EOF) 73901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty except: 740a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty pass 75901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 76901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.lldb_avg = self.stopwatch.avg() 77901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty if self.TraceOn(): 78901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print "lldb expression benchmark:", str(self.stopwatch) 79901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child = None 80901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 81901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty def run_gdb_repeated_exprs(self, exe_name, count): 82901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty exe = os.path.join(os.getcwd(), exe_name) 83901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 84901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Set self.child_prompt, which is "(gdb) ". 85901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child_prompt = '(gdb) ' 86901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty prompt = self.child_prompt 870a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty 88901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # So that the child gets torn down after the test. 89901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child = pexpect.spawn('gdb --nx %s' % exe) 90901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child = self.child 91901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 92901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Turn on logging for what the child sends back. 93901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty if self.TraceOn(): 94901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.logfile_read = sys.stdout 95901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 96901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 97901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('break %s:%d' % (self.source, self.line_to_break)) 98901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 99901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('run') 100901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 101901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty expr_cmd1 = 'print ptr[j]->point.x' 1020a056afb714f471a21aa7e06b17744de71c22378Dirk Dougherty expr_cmd2 = 'print ptr[j]->point.y' 103901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 104901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty # Reset the stopwatch now. 105901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.stopwatch.reset() 106901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty for i in range(count): 107901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty with self.stopwatch: 108901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline(expr_cmd1) 109901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 110901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline(expr_cmd2) 111901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 112901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('continue') 113901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact(prompt) 114901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 115901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('quit') 116901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.expect_exact('The program is running. Exit anyway?') 117901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty child.sendline('y') 118901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty try: 119901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child.expect(pexpect.EOF) 120901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty except: 121901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty pass 122901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 123901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.gdb_avg = self.stopwatch.avg() 124901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty if self.TraceOn(): 125901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty print "gdb expression benchmark:", str(self.stopwatch) 126901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty self.child = None 127901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 128901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty 129b4c6c1b218dc0c044b40c5132ae890a3a6910f69Dirk Doughertyif __name__ == '__main__': 130901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty import atexit 131901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty lldb.SBDebugger.Initialize() 132901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty atexit.register(lambda: lldb.SBDebugger.Terminate()) 133901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty unittest2.main() 134901305d0a11d86eec516bd085a39d7eafde46047Dirk Dougherty