"""Test that SBFrame::FindValue finds things but does not duplicate the entire variables list"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class SBFrameFindValueTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def test_formatters_api(self):
"""Test that SBFrame::FindValue finds things but does not duplicate the entire variables list"""
self.build()
self.setTearDownCleanup()
exe = self.getBuildArtifact("a.out")
# Create the target
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)
# Set the breakpoints
breakpoint = target.BreakpointCreateBySourceRegex(
"Set breakpoint here", lldb.SBFileSpec("main.cpp")
)
self.assertGreater(breakpoint.GetNumLocations(), 0, VALID_BREAKPOINT)
# Launch the process, and do not stop at the entry point.
process = target.LaunchSimple(None, None, self.get_process_working_directory())
self.assertTrue(process, PROCESS_IS_VALID)
# Frame #0 should be at our breakpoint.
threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint)
self.assertEqual(len(threads), 1)
self.thread = threads[0]
self.frame = self.thread.frames[0]
self.assertTrue(self.frame, "Frame 0 is valid.")
self.assertEqual(
self.frame.GetVariables(True, True, False, True).GetSize(),
2,
"variable count is off",
)
self.assertFalse(
self.frame.FindValue(
"NoSuchThing",
lldb.eValueTypeVariableArgument,
lldb.eDynamicCanRunTarget,
).IsValid(),
"found something that should not be here",
)
self.assertEqual(
self.frame.GetVariables(True, True, False, True).GetSize(),
2,
"variable count is off after failed FindValue()",
)
self.assertTrue(
self.frame.FindValue(
"a", lldb.eValueTypeVariableArgument, lldb.eDynamicCanRunTarget
).IsValid(),
"FindValue() didn't find an argument",
)
self.assertEqual(
self.frame.GetVariables(True, True, False, True).GetSize(),
2,
"variable count is off after successful FindValue()",
)