asserts are available. LLDB also has a few custom asserts that are tailored
to our own data types.
-+-----------------------------------------------+---------------------------------------------------------------+
++-----------------------------------------------+-----------------------------------------------------------------+
| **Assert** | **Description** |
-+-----------------------------------------------+---------------------------------------------------------------+
++-----------------------------------------------+-----------------------------------------------------------------+
| ``assertSuccess`` | Assert that an ``lldb.SBError`` is in the "success" state. |
-+-----------------------------------------------+---------------------------------------------------------------+
++-----------------------------------------------+-----------------------------------------------------------------+
| ``assertState`` | Assert that two states (``lldb.eState*``) are equal. |
-+-----------------------------------------------+---------------------------------------------------------------+
++-----------------------------------------------+-----------------------------------------------------------------+
+| ``assertStopReason`` | Assert that two stop reasons (``lldb.eStopReason*``) are equal. |
++-----------------------------------------------+-----------------------------------------------------------------+
If you can't find a specific assert that fits your needs and you fall back
to a generic assert, make sure you put useful information into the assert's
lldbutil.state_type_to_str(second), second)
self.fail(self._formatMessage(msg, error))
+ """Assert two stop reasons are equal"""
+ def assertStopReason(self, first, second, msg=None):
+ if first != second:
+ error = "{} ({}) != {} ({})".format(
+ lldbutil.stop_reason_to_str(first), first,
+ lldbutil.stop_reason_to_str(second), second)
+ self.fail(self._formatMessage(msg, error))
+
def createTestTarget(self, file_path=None, msg=None,
load_dependent_modules=True):
"""
return "plancomplete"
elif enum == lldb.eStopReasonThreadExiting:
return "threadexiting"
+ elif enum == lldb.eStopReasonInstrumentation:
+ return "instrumentation"
+ elif enum == lldb.eStopReasonProcessorTrace:
+ return "processortrace"
else:
raise Exception("Unknown StopReason enum")
for elem in stop_list:
command += " -b {0}".format(elem)
self.expect(command)
- self.assertEqual(self.thread.stop_reason, lldb.eStopReasonBreakpoint, "Hit a breakpoint")
+ self.assertStopReason(self.thread.stop_reason, lldb.eStopReasonBreakpoint, "Hit a breakpoint")
self.assertEqual(self.thread.GetStopReasonDataAtIndex(0), bkpt_to_hit, "Hit the right breakpoint")
if loc_to_hit != 0:
self.assertEqual(self.thread.GetStopReasonDataAtIndex(1), loc_to_hit, "Hit the right location")
process.Continue();
self.assertState(process.GetState(), lldb.eStateStopped)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonWatchpoint)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonWatchpoint)
self.assertTrue(read_watchpoint, "Failed to set read watchpoint.")
thread.StepOver()
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonWatchpoint,
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonWatchpoint,
STOPPED_DUE_TO_WATCHPOINT)
self.assertEquals(thread.GetStopDescription(20), 'watchpoint 1')
self.assertSuccess(error, "Error while setting watchpoint")
thread.StepOver()
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonWatchpoint,
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonWatchpoint,
STOPPED_DUE_TO_WATCHPOINT)
self.assertEquals(thread.GetStopDescription(20), 'watchpoint 2')
"Watchpoint ID didn't match.")
watchpoint_hit = True
else:
- self.assertEquals(stop_reason, lldb.eStopReasonPlanComplete,
+ self.assertStopReason(stop_reason, lldb.eStopReasonPlanComplete,
STOPPED_DUE_TO_STEP_IN)
self.assertTrue(watchpoint_hit, "Watchpoint never hit.")
process.Continue()
stop_reason = thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonWatchpoint, "watchpoint for x1 not hit")
+ self.assertStopReason(stop_reason, lldb.eStopReasonWatchpoint, "watchpoint for x1 not hit")
stop_reason_descr = thread.GetStopDescription(256)
self.assertEqual(stop_reason_descr, "watchpoint 1")
process.Continue()
stop_reason = thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonWatchpoint, "watchpoint for x2 not hit")
+ self.assertStopReason(stop_reason, lldb.eStopReasonWatchpoint, "watchpoint for x2 not hit")
stop_reason_descr = thread.GetStopDescription(256)
self.assertEqual(stop_reason_descr, "watchpoint 2")
stop_reason = thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonBreakpoint, "We didn't stop at our breakpoint.")
+ self.assertStopReason(stop_reason, lldb.eStopReasonBreakpoint, "We didn't stop at our breakpoint.")
if test_enable:
wp.SetEnabled(True)
self.assertTrue(wp.IsEnabled(), "The watchpoint thinks it is still disabled.")
process.Continue()
stop_reason = thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonWatchpoint, "We didn't stop at our watchpoint")
+ self.assertStopReason(stop_reason, lldb.eStopReasonWatchpoint, "We didn't stop at our watchpoint")
process.Continue()
for thread in process.threads:
if thread.id == main_thread.id:
- self.assertEqual(thread.stop_reason, lldb.eStopReasonBreakpoint)
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonBreakpoint)
else:
- self.assertEqual(thread.stop_reason, lldb.eStopReasonNone)
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonNone)
self.thread.StepOver()
# We should be stopped at the breakpoint_2 line with stop plan complete reason
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
self.thread.StepOver()
# We should be stopped at the breakpoint_3 line with stop plan complete reason
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
self.thread.StepOver()
# We should be stopped at the breakpoint_4
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonBreakpoint)
+ self.assertStopReason(self.thread.GetStopReason(), lldb.eStopReasonBreakpoint)
thread1 = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint4)
self.assertEquals(self.thread, thread1, "Didn't stop at breakpoint 4.")
process.Continue()
for thread in process.threads:
if thread.id == main_thread.id:
- self.assertEqual(thread.stop_reason, lldb.eStopReasonBreakpoint)
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonBreakpoint)
else:
- self.assertEqual(thread.stop_reason, lldb.eStopReasonNone)
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonNone)
self.assertEqual(thread_1.GetName(), "three", "Thread_0 is called three")
self.assertTrue(thread_1.IsValid(), "Thread_1 is valid")
- self.assertEqual(thread_1.GetStopReason(), lldb.eStopReasonBreakpoint, "Stopped at breakpoint")
+ self.assertStopReason(thread_1.GetStopReason(), lldb.eStopReasonBreakpoint, "Stopped at breakpoint")
"instrumentation_class",
"selector"
])
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonInstrumentation)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonInstrumentation)
output_lines = self.res.GetOutput().split('\n')
json_line = '\n'.join(output_lines[2:])
data = json.loads(json_line)
for thread in process:
reason = thread.GetStopReason()
- self.assertEqual(reason, lldb.eStopReasonSignal)
+ self.assertStopReason(reason, lldb.eStopReasonSignal)
signal = thread.GetStopReasonDataAtIndex(1)
# Check we got signal 19 (SIGSTOP)
self.assertEqual(signal, 19)
self.assertEqual(bytes_read, None)
reason = thread.GetStopReason()
if( thread.GetThreadID() == tid ):
- self.assertEqual(reason, lldb.eStopReasonSignal)
+ self.assertStopReason(reason, lldb.eStopReasonSignal)
signal = thread.GetStopReasonDataAtIndex(1)
# Check we got signal 4 (SIGILL)
self.assertEqual(signal, 4)
# one and only thread.
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
stop_description = thread.GetStopDescription(256)
self.assertIn("SIGSEGV", stop_description)
self.check_state()
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonNone)
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
self.check_state()
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonNone)
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
self.check_state()
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonNone)
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
registers = thread.GetFrameAtIndex(0).GetRegisters()
self.check_state()
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonNone)
stop_description = thread.GetStopDescription(256)
self.assertEqual(stop_description, "")
registers = thread.GetFrameAtIndex(0).GetRegisters()
# one and only thread.
self.assertEqual(self.process.GetNumThreads(), 1)
thread = self.process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonException)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonException)
stop_description = thread.GetStopDescription(256)
self.assertIn("0xc0000005", stop_description)
thread = process.GetSelectedThread()
self.assertTrue(thread)
self.assertEqual(thread.GetThreadID(), 1)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataCount(), 1)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), signal.SIGSEGV)
backtrace = ["bar", "foo", "main"]
thread = process.GetSelectedThread()
self.assertTrue(thread)
self.assertEqual(thread.GetThreadID(), 2)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataCount(), 1)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), signal.SIGSEGV)
backtrace = ["bar", "foo", "lwp_main"]
# thread 1 should have no signal
thread = process.GetThreadByID(1)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataCount(), 1)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), 0)
thread = process.GetSelectedThread()
self.assertTrue(thread)
self.assertEqual(thread.GetThreadID(), 2)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataCount(), 1)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), signal.SIGSEGV)
backtrace = ["bar", "foo", "lwp_main"]
# thread 1 should have the same signal
thread = process.GetThreadByID(1)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataCount(), 1)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), signal.SIGSEGV)
# In the dump, none of the threads are stopped, so we cannot use
# lldbutil.get_stopped_thread.
thread = process.GetThreadAtIndex(0)
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonNone)
def test_stack_info_in_wow64_mini_dump(self):
"""Test that we can see a trivial stack in a VS-generate mini dump."""
# step over the setpgid() call
thread.StepOver()
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
# verify that the process group has been set correctly
# this also checks that we are still in full control of the child
thread.StepOut()
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
frame = thread.GetFrameAtIndex(0)
fun_name = frame.GetFunctionName()
thread.StepOutOfFrame(frame)
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
frame = thread.GetFrameAtIndex(0)
fun_name = frame.GetFunctionName()
self.assertEquals(fun_name, "main")
thread.StepOut()
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
frame = thread.GetFrameAtIndex(0)
fun_name = frame.GetFunctionName()
thread.StepOut()
self.assertState(self.process.GetState(), lldb.eStateStopped)
- self.assertEquals(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
# Assuming all these functions step out to main. Could figure out the caller dynamically
# if that would add something to the test.
self.assertTrue(thread, "Invalid thread.")
self.assertEqual(thread.GetThreadID(), 0x19)
self.assertEqual(thread.GetName(), "DummyScriptedThread.thread-1")
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
self.assertGreater(thread.GetNumFrames(), 0)
process.Continue()
self.assertState(process.GetState(), lldb.eStateStopped, "We didn't stop for the load")
self.assertEqual(backstop_bkpt_2.GetHitCount(), 0, "Hit our backstop breakpoint")
- self.assertEqual(thread.stop_reason, lldb.eStopReasonBreakpoint, "We attributed the stop to the breakpoint")
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonBreakpoint, "We attributed the stop to the breakpoint")
self.assertEqual(load_bkpt.GetHitCount(), 1, "We hit our breakpoint at the load address")
else:
bkpt_modifier(load_bkpt)
process.Continue()
self.assertState(process.GetState(), lldb.eStateStopped, "We didn't stop")
self.assertTrue(thread.IsValid(), "Our thread was no longer valid.")
- self.assertEqual(thread.stop_reason, lldb.eStopReasonBreakpoint, "We didn't hit some breakpoint")
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonBreakpoint, "We didn't hit some breakpoint")
self.assertEqual(backstop_bkpt_2.GetHitCount(), 1, "We continued to the right breakpoint")
'Number of expected threads and actual threads do not match after thread exit.')
stop_reason = stepping_thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonPlanComplete, "Stopped for plan completion")
+ self.assertStopReason(stop_reason, lldb.eStopReasonPlanComplete, "Stopped for plan completion")
# Run to completion
self.runCmd("process continue")
# If we aren't stopped out the thread breakpoint try to resume.
if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
self.runCmd("thread continue %d"%(i+1))
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonBreakpoint)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonBreakpoint)
expect_threads += " #%d"%(i+1)
# Stop the process
self.runCmd("process interrupt")
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonSignal)
# Get the inferior out of its loop
self.runCmd("expression g_test = 1")
# Stop the process
self.runCmd("process interrupt")
- self.assertEqual(thread.GetState(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetState(), lldb.eStopReasonSignal)
# Check the thread state
self.assertTrue(
thread.IsSuspended(),
"Thread state is \'suspended\' after expression evaluation.")
- self.assertEqual(thread.GetState(), lldb.eStopReasonSignal)
+ self.assertStopReason(thread.GetState(), lldb.eStopReasonSignal)
# Run to breakpoint 2
self.runCmd("continue")
- self.assertEqual(thread.GetState(), lldb.eStopReasonBreakpoint)
+ self.assertStopReason(thread.GetState(), lldb.eStopReasonBreakpoint)
# Make sure both threads are stopped
self.assertTrue(
stop_reason = other_thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonBreakpoint,
+ self.assertStopReason(stop_reason, lldb.eStopReasonBreakpoint,
"Still records stopped at breakpoint: %s"
%(lldbutil.stop_reason_to_str(stop_reason)))
self.assertEqual(other_thread.GetStopReasonDataAtIndex(0), 1,
substrs=['stopped', 'stop reason ='])
stop_reason = thread.GetStopReason()
- self.assertEqual(stop_reason, lldb.eStopReasonInstrumentation)
+ self.assertStopReason(stop_reason, lldb.eStopReasonInstrumentation)
# test that the UBSan dylib is present
self.expect(
process.Continue()
self.assertEqual(thread.GetFrameAtIndex(0).GetFunctionName(), "a")
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
# And one more time should get us back to main:
process.Continue()
self.assertEqual(thread.GetFrameAtIndex(0).GetFunctionName(), "main")
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
# Now make sure we can call a function, break in the called function,
# then have "continue" get us back out again:
name = thread.frame[0].name
self.fail("Hit breakpoint {0} in '{1}' rather than getting a SIGBUS".format(id, name))
- self.assertEqual(thread.stop_reason, lldb.eStopReasonSignal)
+ self.assertStopReason(thread.stop_reason, lldb.eStopReasonSignal)
self.assertEqual(thread.GetStopReasonDataAtIndex(0), 10, "Got a SIGBUS")
# Now when we continue, we'll find our way into the signal handler:
# main2.cpp.
frame0 = thread.GetFrameAtIndex(0)
lineEntry = frame0.GetLineEntry()
- self.assertEqual(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
+ self.assertStopReason(thread.GetStopReason(), lldb.eStopReasonPlanComplete)
# Expected failure with clang as the compiler.
# rdar://problem/9223880
#