139 lines
4.7 KiB
Python
139 lines
4.7 KiB
Python
import re
|
|
import uuid
|
|
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
|
|
|
|
class SBTargetExtensionsTestCase(TestBase):
|
|
def test_equality(self):
|
|
"""Test the equality operator for SBTarget."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
self.assertEqual(target, target)
|
|
self.assertNotEqual(target, lldb.SBTarget())
|
|
|
|
def test_module_access(self):
|
|
"""Test the module access extension properties and methods."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
self.assertTrue(len(target.modules) > 0)
|
|
module = target.module[0]
|
|
self.assertTrue(module.IsValid())
|
|
|
|
self.assertEqual(target.module["a.out"], module)
|
|
self.assertEqual(target.module[module.file.fullpath], module)
|
|
|
|
uuid_str = module.GetUUIDString()
|
|
if uuid_str:
|
|
try:
|
|
uuid_obj = uuid.UUID(uuid_str)
|
|
self.assertEqual(target.module[uuid_obj], module)
|
|
except ValueError:
|
|
pass
|
|
|
|
self.assertEqual(len(target.module[re.compile("a.out")]), 1)
|
|
self.assertEqual(target.module[re.compile("a.out")][0], module)
|
|
|
|
def test_process_creation(self):
|
|
"""Test process creation via extensions."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
self.assertFalse(target.process.IsValid())
|
|
|
|
process = target.LaunchSimple(None, None, self.get_process_working_directory())
|
|
self.assertTrue(process.IsValid())
|
|
|
|
self.assertEqual(target.process.GetProcessID(), process.GetProcessID())
|
|
|
|
def test_breakpoints(self):
|
|
"""Test breakpoint access via extensions."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
breakpoint = target.BreakpointCreateBySourceRegex(
|
|
"Set breakpoint here", lldb.SBFileSpec("main.c")
|
|
)
|
|
self.assertTrue(breakpoint.IsValid())
|
|
|
|
self.assertEqual(target.num_breakpoints, 1)
|
|
self.assertEqual(len(target.breakpoints), 1)
|
|
|
|
self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID())
|
|
|
|
self.assertEqual(
|
|
target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID()
|
|
)
|
|
|
|
def test_watchpoints(self):
|
|
"""Test watchpoint access via extensions."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
breakpoint = target.BreakpointCreateBySourceRegex(
|
|
"Set breakpoint here", lldb.SBFileSpec("main.c")
|
|
)
|
|
self.assertTrue(breakpoint.IsValid())
|
|
|
|
process = target.LaunchSimple(None, None, self.get_process_working_directory())
|
|
self.assertTrue(process.IsValid())
|
|
|
|
self.assertEqual(process.GetState(), lldb.eStateStopped)
|
|
|
|
variables = target.FindGlobalVariables("g_var", 1)
|
|
self.assertTrue(variables.GetSize() > 0)
|
|
|
|
global_variable = variables.GetValueAtIndex(0)
|
|
error = lldb.SBError()
|
|
|
|
watchpoint = target.WatchAddress(
|
|
global_variable.GetLoadAddress(), 4, False, True, error
|
|
)
|
|
self.assertTrue(error.Success(), f"Watchpoint failed: {error.GetCString()}")
|
|
|
|
self.assertTrue(target.num_watchpoints > 0)
|
|
self.assertEqual(len(target.watchpoints), target.num_watchpoints)
|
|
|
|
self.assertEqual(target.watchpoint[0].GetID(), target.watchpoints[0].GetID())
|
|
self.assertEqual(target.watchpoint[0].GetID(), watchpoint.GetID())
|
|
|
|
def test_other_properties(self):
|
|
"""Test miscellaneous properties of SBTarget."""
|
|
self.build()
|
|
exe = self.getBuildArtifact("a.out")
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(target.IsValid())
|
|
|
|
self.assertTrue(target.executable.IsValid())
|
|
|
|
self.assertEqual(target.debugger.GetID(), self.dbg.GetID())
|
|
|
|
self.assertTrue(target.broadcaster.IsValid())
|
|
self.assertIn(
|
|
target.byte_order,
|
|
[lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid],
|
|
)
|
|
self.assertTrue(target.addr_size > 0)
|
|
self.assertIsNotNone(target.triple)
|
|
self.assertIsNotNone(target.arch_name)
|
|
|
|
self.assertTrue(target.data_byte_size > 0)
|
|
self.assertGreater(target.data_byte_size, 0)
|
|
self.assertGreater(target.code_byte_size, 0)
|
|
|
|
self.assertTrue(target.platform.IsValid())
|