1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
"""Test evaluating expressions repeatedly comparing lldb against gdb."""
import sys
import lldb
from lldbsuite.test.lldbbench import BenchBase
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import configuration
from lldbsuite.test import lldbutil
class RepeatedExprsCase(BenchBase):
def setUp(self):
BenchBase.setUp(self)
self.source = "main.cpp"
self.line_to_break = line_number(self.source, "// Set breakpoint here.")
self.lldb_avg = None
self.gdb_avg = None
self.count = 100
@benchmarks_test
@expectedFailureAll(
oslist=["windows"],
bugnumber="llvm.org/pr22274: need a pexpect replacement for windows",
)
def test_compare_lldb_to_gdb(self):
"""Test repeated expressions with lldb vs. gdb."""
self.build()
self.exe_name = "a.out"
print()
self.run_lldb_repeated_exprs(self.exe_name, self.count)
print("lldb benchmark:", self.stopwatch)
self.run_gdb_repeated_exprs(self.exe_name, self.count)
print("gdb benchmark:", self.stopwatch)
print("lldb_avg/gdb_avg: %f" % (self.lldb_avg / self.gdb_avg))
def run_lldb_repeated_exprs(self, exe_name, count):
import pexpect
exe = self.getBuildArtifact(exe_name)
# Set self.child_prompt, which is "(lldb) ".
self.child_prompt = "(lldb) "
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 -l %d" % (self.source, self.line_to_break))
child.expect_exact(prompt)
child.sendline("run")
child.expect_exact(prompt)
expr_cmd1 = "expr ptr[j]->point.x"
expr_cmd2 = "expr ptr[j]->point.y"
# Reset the stopwatch now.
self.stopwatch.reset()
for i in range(count):
with self.stopwatch:
child.sendline(expr_cmd1)
child.expect_exact(prompt)
child.sendline(expr_cmd2)
child.expect_exact(prompt)
child.sendline("process continue")
child.expect_exact(prompt)
child.sendline("quit")
try:
self.child.expect(pexpect.EOF)
except:
pass
self.lldb_avg = self.stopwatch.avg()
if self.TraceOn():
print("lldb expression benchmark:", str(self.stopwatch))
self.child = None
def run_gdb_repeated_exprs(self, exe_name, count):
import pexpect
exe = self.getBuildArtifact(exe_name)
# Set self.child_prompt, which is "(gdb) ".
self.child_prompt = "(gdb) "
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:%d" % (self.source, self.line_to_break))
child.expect_exact(prompt)
child.sendline("run")
child.expect_exact(prompt)
expr_cmd1 = "print ptr[j]->point.x"
expr_cmd2 = "print ptr[j]->point.y"
# Reset the stopwatch now.
self.stopwatch.reset()
for i in range(count):
with self.stopwatch:
child.sendline(expr_cmd1)
child.expect_exact(prompt)
child.sendline(expr_cmd2)
child.expect_exact(prompt)
child.sendline("continue")
child.expect_exact(prompt)
child.sendline("quit")
child.expect_exact("The program is running. Exit anyway?")
child.sendline("y")
try:
self.child.expect(pexpect.EOF)
except:
pass
self.gdb_avg = self.stopwatch.avg()
if self.TraceOn():
print("gdb expression benchmark:", str(self.stopwatch))
self.child = None
|