blob: 98a2ec9ebf231d7686a8ed082698dc4b87a8402b [file] [log] [blame]
"""Benchmark the turnaround time starting a debugger and run to the breakpoint with lldb vs. gdb."""
import sys
import lldb
from lldbsuite.test.lldbbench import *
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import configuration
from lldbsuite.test import lldbutil
class CompileRunToBreakpointBench(BenchBase):
def setUp(self):
BenchBase.setUp(self)
self.exe = lldbtest_config.lldbExec
self.function = "Driver::MainLoop()"
self.count = 3
self.lldb_avg = None
self.gdb_avg = None
@benchmarks_test
@no_debug_info_test
@expectedFailureAll(
oslist=["windows"],
bugnumber="llvm.org/pr22274: need a pexpect replacement for windows",
)
def test_run_lldb_then_gdb(self):
"""Benchmark turnaround time with lldb vs. gdb."""
print()
self.run_lldb_turnaround(self.exe, self.function, self.count)
print("lldb turnaround benchmark:", self.stopwatch)
self.run_gdb_turnaround(self.exe, self.function, self.count)
print("gdb turnaround benchmark:", self.stopwatch)
print("lldb_avg/gdb_avg: %f" % (self.lldb_avg / self.gdb_avg))
def run_lldb_turnaround(self, exe, function, count):
import pexpect
def run_one_round():
prompt = self.child_prompt
# So that the child gets torn down after the test.
self.child = pexpect.spawn(
"%s %s %s" % (lldbtest_config.lldbExec, self.lldbOption, 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("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):
import pexpect
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