Adds @skipIfPlatform and @skipUnlessPlatform decorators which will skip if / unless the target platform is in the provided platform list. Test Plan: ninja check-lldb shows no regressions. When running cross platform, tests which cannot run on the target platform are skipped. Differential Revision: http://reviews.llvm.org/D8665 llvm-svn: 233547
125 lines
4.6 KiB
Python
125 lines
4.6 KiB
Python
"""Test stepping over watchpoints."""
|
|
|
|
import unittest2
|
|
import lldb
|
|
import lldbutil
|
|
from lldbtest import *
|
|
|
|
|
|
class TestStepOverWatchpoint(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
def getCategories(self):
|
|
return ['basic_process']
|
|
|
|
@skipUnlessDarwin
|
|
@dsym_test
|
|
def test_with_dsym(self):
|
|
"""Test stepping over watchpoints."""
|
|
self.buildDsym()
|
|
self.step_over_watchpoint()
|
|
|
|
@dwarf_test
|
|
def test_with_dwarf(self):
|
|
"""Test stepping over watchpoints."""
|
|
self.buildDwarf()
|
|
self.step_over_watchpoint()
|
|
|
|
def setUp(self):
|
|
TestBase.setUp(self)
|
|
|
|
def step_inst_for_watchpoint(self, wp_id):
|
|
watchpoint_hit = False
|
|
current_line = self.frame().GetLineEntry().GetLine()
|
|
while self.frame().GetLineEntry().GetLine() == current_line:
|
|
self.thread().StepInstruction(False) # step_over=False
|
|
stop_reason = self.thread().GetStopReason()
|
|
if stop_reason == lldb.eStopReasonWatchpoint:
|
|
self.assertFalse(watchpoint_hit, "Watchpoint already hit.")
|
|
expected_stop_desc = "watchpoint %d" % wp_id
|
|
actual_stop_desc = self.thread().GetStopDescription(20)
|
|
self.assertTrue(actual_stop_desc == expected_stop_desc,
|
|
"Watchpoint ID didn't match.")
|
|
watchpoint_hit = True
|
|
else:
|
|
self.assertTrue(stop_reason == lldb.eStopReasonPlanComplete,
|
|
STOPPED_DUE_TO_STEP_IN)
|
|
self.assertTrue(watchpoint_hit, "Watchpoint never hit.")
|
|
|
|
def step_over_watchpoint(self):
|
|
"""Test stepping over watchpoints."""
|
|
exe = os.path.join(os.getcwd(), 'a.out')
|
|
|
|
target = self.dbg.CreateTarget(exe)
|
|
self.assertTrue(self.target, VALID_TARGET)
|
|
|
|
lldbutil.run_break_set_by_symbol(self, 'main')
|
|
|
|
process = target.LaunchSimple(None, None,
|
|
self.get_process_working_directory())
|
|
self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
|
|
self.assertTrue(process.GetState() == lldb.eStateStopped,
|
|
PROCESS_STOPPED)
|
|
|
|
thread = lldbutil.get_stopped_thread(process,
|
|
lldb.eStopReasonBreakpoint)
|
|
self.assertTrue(thread.IsValid(), "Failed to get thread.")
|
|
|
|
frame = thread.GetFrameAtIndex(0)
|
|
self.assertTrue(frame.IsValid(), "Failed to get frame.")
|
|
|
|
read_value = frame.FindValue('g_watch_me_read',
|
|
lldb.eValueTypeVariableGlobal)
|
|
self.assertTrue(read_value.IsValid(), "Failed to find read value.")
|
|
|
|
error = lldb.SBError()
|
|
|
|
# resolve_location=True, read=True, write=False
|
|
read_watchpoint = read_value.Watch(True, True, False, error)
|
|
self.assertTrue(error.Success(),
|
|
"Error while setting watchpoint: %s" %
|
|
error.GetCString())
|
|
self.assertTrue(read_watchpoint, "Failed to set read watchpoint.")
|
|
|
|
write_value = frame.FindValue('g_watch_me_write',
|
|
lldb.eValueTypeVariableGlobal)
|
|
self.assertTrue(write_value, "Failed to find write value.")
|
|
|
|
# resolve_location=True, read=False, write=True
|
|
write_watchpoint = write_value.Watch(True, False, True, error)
|
|
self.assertTrue(read_watchpoint, "Failed to set write watchpoint.")
|
|
self.assertTrue(error.Success(),
|
|
"Error while setting watchpoint: %s" %
|
|
error.GetCString())
|
|
|
|
thread.StepOver()
|
|
self.assertTrue(thread.GetStopReason() == lldb.eStopReasonWatchpoint,
|
|
STOPPED_DUE_TO_WATCHPOINT)
|
|
self.assertTrue(thread.GetStopDescription(20) == 'watchpoint 1')
|
|
|
|
process.Continue()
|
|
self.assertTrue(process.GetState() == lldb.eStateStopped,
|
|
PROCESS_STOPPED)
|
|
self.assertTrue(thread.GetStopDescription(20) == 'step over')
|
|
|
|
self.step_inst_for_watchpoint(1)
|
|
|
|
thread.StepOver()
|
|
self.assertTrue(thread.GetStopReason() == lldb.eStopReasonWatchpoint,
|
|
STOPPED_DUE_TO_WATCHPOINT)
|
|
self.assertTrue(thread.GetStopDescription(20) == 'watchpoint 2')
|
|
|
|
process.Continue()
|
|
self.assertTrue(process.GetState() == lldb.eStateStopped,
|
|
PROCESS_STOPPED)
|
|
self.assertTrue(thread.GetStopDescription(20) == 'step over')
|
|
|
|
self.step_inst_for_watchpoint(2)
|
|
|
|
if __name__ == '__main__':
|
|
import atexit
|
|
lldb.SBDebugger.Initialize()
|
|
atexit.register(lambda: lldb.SBDebugger.Terminate())
|
|
unittest2.main()
|