# encoding: utf-8 """ Test lldb's frame recognizers. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil import recognizer class FrameRecognizerTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True @skipUnlessDarwin def test_frame_recognizer_1(self): self.build() target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) self.assertTrue(target, VALID_TARGET) self.runCmd("command script import " + os.path.join(self.getSourceDir(), "recognizer.py")) self.expect("frame recognizer list", substrs=['no matching results found.']) self.runCmd("frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo") self.expect("frame recognizer list", substrs=['0: recognizer.MyFrameRecognizer, module a.out, function foo']) self.runCmd("frame recognizer add -l recognizer.MyOtherFrameRecognizer -s a.out -n bar -x") self.expect("frame recognizer list", substrs=['0: recognizer.MyFrameRecognizer, module a.out, function foo', '1: recognizer.MyOtherFrameRecognizer, module a.out, function bar (regexp)' ]) self.runCmd("frame recognizer delete 0") self.expect("frame recognizer list", substrs=['1: recognizer.MyOtherFrameRecognizer, module a.out, function bar (regexp)']) self.runCmd("frame recognizer clear") self.expect("frame recognizer list", substrs=['no matching results found.']) self.runCmd("frame recognizer add -l recognizer.MyFrameRecognizer -s a.out -n foo") lldbutil.run_break_set_by_symbol(self, "foo") self.runCmd("r") self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=['stopped', 'stop reason = breakpoint']) process = target.GetProcess() thread = process.GetSelectedThread() frame = thread.GetSelectedFrame() self.assertEqual(frame.GetSymbol().GetName(), "foo") self.assertFalse(frame.GetLineEntry().IsValid()) self.expect("frame variable", substrs=['(int) a = 42', '(int) b = 56']) # Recognized arguments don't show up by default... variables = frame.GetVariables(lldb.SBVariablesOptions()) self.assertEqual(variables.GetSize(), 0) # ...unless you set target.display-recognized-arguments to 1... self.runCmd("settings set target.display-recognized-arguments 1") variables = frame.GetVariables(lldb.SBVariablesOptions()) self.assertEqual(variables.GetSize(), 2) # ...and you can reset it back to 0 to hide them again... self.runCmd("settings set target.display-recognized-arguments 0") variables = frame.GetVariables(lldb.SBVariablesOptions()) self.assertEqual(variables.GetSize(), 0) # ... or explicitly ask for them with SetIncludeRecognizedArguments(True). opts = lldb.SBVariablesOptions() opts.SetIncludeRecognizedArguments(True) variables = frame.GetVariables(opts) self.assertEqual(variables.GetSize(), 2) self.assertEqual(variables.GetValueAtIndex(0).name, "a") self.assertEqual(variables.GetValueAtIndex(0).signed, 42) self.assertEqual(variables.GetValueAtIndex(0).GetValueType(), lldb.eValueTypeVariableArgument) self.assertEqual(variables.GetValueAtIndex(1).name, "b") self.assertEqual(variables.GetValueAtIndex(1).signed, 56) self.assertEqual(variables.GetValueAtIndex(1).GetValueType(), lldb.eValueTypeVariableArgument) self.expect("frame recognizer info 0", substrs=['frame 0 is recognized by recognizer.MyFrameRecognizer']) self.expect("frame recognizer info 999", error=True, substrs=['no frame with index 999']) self.expect("frame recognizer info 1", substrs=['frame 1 not recognized by any recognizer']) # FIXME: The following doesn't work yet, but should be fixed. """ lldbutil.run_break_set_by_symbol(self, "bar") self.runCmd("c") self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, substrs=['stopped', 'stop reason = breakpoint']) self.expect("frame variable -t", substrs=['(int *) a = ']) self.expect("frame variable -t *a", substrs=['*a = 78']) """