Summary: LLDB keeps statistics of how many expression evaluations are 'successful' and 'failed' which are updated after each expression evaluation (assuming statistics are enabled). From what I understand the idea is that this could be used to define how well LLDB's expression evaluator is working. Currently all expressions are considered successful unless the user passes an explicit positive element counting to the expression command (with the `-Z` flag) and then passes an expression that successfully evaluates to a type that doesn't support element counting. Expressions that fail to parse, execute or any other outcome are considered successful at the moment which means we nearly always have a 100% expression evaluation success rate. This patch makes that expressions that fail to parse or execute to count as failed expressions. We can't know whether the expression failed because of an user error of because LLDB couldn't correctly parse/compile it, but I would argue that this is still an improvement. Assuming that the percentage of valid user expressions stays mostly constant over time (which seems like a reasonable assumption), then this way we can still see if we are doing relatively better/worse from release to release. Reviewers: davide, aprantl, JDevlieghere Reviewed By: aprantl Subscribers: abidh Differential Revision: https://reviews.llvm.org/D76280
47 lines
2.1 KiB
Python
47 lines
2.1 KiB
Python
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
class TestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
def test(self):
|
|
self.build()
|
|
lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.c"))
|
|
|
|
self.expect("statistics disable", substrs=['need to enable statistics before disabling'], error=True)
|
|
|
|
# 'expression' should change the statistics.
|
|
self.expect("statistics enable")
|
|
self.expect("statistics enable", substrs=['already enabled'], error=True)
|
|
self.expect("expr patatino", substrs=['27'])
|
|
self.expect("statistics disable")
|
|
self.expect("statistics dump", substrs=['expr evaluation successes : 1\n',
|
|
'expr evaluation failures : 0\n'])
|
|
|
|
self.expect("statistics enable")
|
|
# Doesn't parse.
|
|
self.expect("expr doesnt_exist", error=True,
|
|
substrs=["undeclared identifier 'doesnt_exist'"])
|
|
# Doesn't successfully execute.
|
|
self.expect("expr int *i = nullptr; *i", error=True)
|
|
# Interpret an integer as an array with 3 elements is also a failure.
|
|
self.expect("expr -Z 3 -- 1", error=True,
|
|
substrs=["expression cannot be used with --element-count"])
|
|
self.expect("statistics disable")
|
|
# We should have gotten 3 new failures and the previous success.
|
|
self.expect("statistics dump", substrs=['expr evaluation successes : 1\n',
|
|
'expr evaluation failures : 3\n'])
|
|
|
|
# 'frame var' with disabled statistics shouldn't change stats.
|
|
self.expect("frame var", substrs=['27'])
|
|
|
|
self.expect("statistics enable")
|
|
# 'frame var' with enabled statistics will change stats.
|
|
self.expect("frame var", substrs=['27'])
|
|
self.expect("statistics disable")
|
|
self.expect("statistics dump", substrs=['frame var successes : 1\n',
|
|
'frame var failures : 0\n'])
|