2011-10-25 20:08:03 +00:00
|
|
|
"""Benchmark the turnaround time starting a debugger and run to the breakpont with lldb vs. gdb."""
|
|
|
|
|
2015-10-23 17:04:29 +00:00
|
|
|
from __future__ import print_function
|
|
|
|
|
2015-11-03 19:20:39 +00:00
|
|
|
|
2011-10-25 20:08:03 +00:00
|
|
|
import sys
|
|
|
|
import lldb
|
2015-11-03 02:06:18 +00:00
|
|
|
from lldbsuite.test.lldbbench import *
|
2016-02-04 23:04:17 +00:00
|
|
|
from lldbsuite.test.decorators import *
|
|
|
|
from lldbsuite.test.lldbtest import *
|
|
|
|
from lldbsuite.test import configuration
|
|
|
|
from lldbsuite.test import lldbutil
|
2011-10-25 20:08:03 +00:00
|
|
|
|
2016-09-06 20:57:50 +00:00
|
|
|
|
2011-10-25 20:08:03 +00:00
|
|
|
class CompileRunToBreakpointBench(BenchBase):
|
|
|
|
|
2013-12-10 23:19:29 +00:00
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
2011-10-25 20:08:03 +00:00
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
BenchBase.setUp(self)
|
2015-05-18 19:39:03 +00:00
|
|
|
self.exe = lldbtest_config.lldbExec
|
2011-10-25 20:08:03 +00:00
|
|
|
self.function = 'Driver::MainLoop()'
|
2015-12-10 18:52:09 +00:00
|
|
|
self.count = 3
|
2011-10-25 20:08:03 +00:00
|
|
|
|
|
|
|
self.lldb_avg = None
|
|
|
|
self.gdb_avg = None
|
|
|
|
|
|
|
|
@benchmarks_test
|
2015-09-30 10:12:40 +00:00
|
|
|
@no_debug_info_test
|
2016-02-08 19:34:59 +00:00
|
|
|
@expectedFailureAll(
|
|
|
|
oslist=["windows"],
|
|
|
|
bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
|
2011-10-25 20:08:03 +00:00
|
|
|
def test_run_lldb_then_gdb(self):
|
|
|
|
"""Benchmark turnaround time with lldb vs. gdb."""
|
2015-10-23 17:04:29 +00:00
|
|
|
print()
|
2011-10-25 20:08:03 +00:00
|
|
|
self.run_lldb_turnaround(self.exe, self.function, self.count)
|
2015-10-23 17:04:29 +00:00
|
|
|
print("lldb turnaround benchmark:", self.stopwatch)
|
2011-10-25 20:08:03 +00:00
|
|
|
self.run_gdb_turnaround(self.exe, self.function, self.count)
|
2015-10-23 17:04:29 +00:00
|
|
|
print("gdb turnaround benchmark:", self.stopwatch)
|
|
|
|
print("lldb_avg/gdb_avg: %f" % (self.lldb_avg / self.gdb_avg))
|
2011-10-25 20:08:03 +00:00
|
|
|
|
|
|
|
def run_lldb_turnaround(self, exe, function, count):
|
2014-07-18 01:02:02 +00:00
|
|
|
import pexpect
|
2016-09-06 20:57:50 +00:00
|
|
|
|
2011-10-25 20:08:03 +00:00
|
|
|
def run_one_round():
|
|
|
|
prompt = self.child_prompt
|
|
|
|
|
|
|
|
# So that the child gets torn down after the test.
|
2015-05-18 19:39:03 +00:00
|
|
|
self.child = pexpect.spawn(
|
|
|
|
'%s %s %s' %
|
|
|
|
(lldbtest_config.lldbExec, self.lldbOption, exe))
|
2011-10-25 20:08:03 +00:00
|
|
|
child = self.child
|
|
|
|
|
|
|
|
# Turn on logging for what the child sends back.
|
|
|
|
if self.TraceOn():
|
|
|
|
child.logfile_read = sys.stdout
|
|
|
|
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
child.sendline('breakpoint set -F %s' % function)
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
child.sendline('run')
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
|
|
|
|
# Set self.child_prompt, which is "(lldb) ".
|
|
|
|
self.child_prompt = '(lldb) '
|
|
|
|
# Reset the stopwatch now.
|
|
|
|
self.stopwatch.reset()
|
|
|
|
|
|
|
|
for i in range(count + 1):
|
|
|
|
# Ignore the first invoke lldb and run to the breakpoint turnaround
|
|
|
|
# time.
|
|
|
|
if i == 0:
|
|
|
|
run_one_round()
|
|
|
|
else:
|
|
|
|
with self.stopwatch:
|
|
|
|
run_one_round()
|
|
|
|
|
|
|
|
self.child.sendline('quit')
|
|
|
|
try:
|
|
|
|
self.child.expect(pexpect.EOF)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
self.lldb_avg = self.stopwatch.avg()
|
|
|
|
self.child = None
|
|
|
|
|
|
|
|
def run_gdb_turnaround(self, exe, function, count):
|
2014-07-18 01:02:02 +00:00
|
|
|
import pexpect
|
2016-09-06 20:57:50 +00:00
|
|
|
|
2011-10-25 20:08:03 +00:00
|
|
|
def run_one_round():
|
|
|
|
prompt = self.child_prompt
|
|
|
|
|
|
|
|
# So that the child gets torn down after the test.
|
|
|
|
self.child = pexpect.spawn('gdb --nx %s' % exe)
|
|
|
|
child = self.child
|
|
|
|
|
|
|
|
# Turn on logging for what the child sends back.
|
|
|
|
if self.TraceOn():
|
|
|
|
child.logfile_read = sys.stdout
|
|
|
|
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
child.sendline('break %s' % function)
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
child.sendline('run')
|
|
|
|
child.expect_exact(prompt)
|
|
|
|
|
|
|
|
# Set self.child_prompt, which is "(gdb) ".
|
|
|
|
self.child_prompt = '(gdb) '
|
|
|
|
# Reset the stopwatch now.
|
|
|
|
self.stopwatch.reset()
|
|
|
|
|
|
|
|
for i in range(count + 1):
|
|
|
|
# Ignore the first invoke lldb and run to the breakpoint turnaround
|
|
|
|
# time.
|
|
|
|
if i == 0:
|
|
|
|
run_one_round()
|
|
|
|
else:
|
|
|
|
with self.stopwatch:
|
|
|
|
run_one_round()
|
|
|
|
|
|
|
|
self.child.sendline('quit')
|
|
|
|
self.child.expect_exact('The program is running. Exit anyway?')
|
|
|
|
self.child.sendline('y')
|
|
|
|
try:
|
|
|
|
self.child.expect(pexpect.EOF)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
|
|
|
self.gdb_avg = self.stopwatch.avg()
|
|
|
|
self.child = None
|