Files
clang-p2996/lldb/test/linux/thread/create_during_instruction_step/TestCreateDuringInstructionStep.py
Pavel Labath db2f8a3cfd Add the correct decorator to TestCreateDuringInstructionStep
apparently, just placing the file under linux/ does not make the test linux specific. :)

llvm-svn: 245848
2015-08-24 15:49:12 +00:00

73 lines
2.6 KiB
Python

"""
This tests that we do not lose control of the inferior, while doing an instruction-level step
over a thread creation instruction.
"""
import os
import unittest2
import lldb
from lldbtest import *
import lldbutil
class CreateDuringInstructionStepTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
@skipUnlessPlatform(['linux'])
@dwarf_test
def test_step_inst_with_dwarf(self):
self.buildDwarf(dictionary=self.getBuildFlags())
self.create_during_step_inst_test()
def create_during_step_inst_test(self):
exe = os.path.join(os.getcwd(), "a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target and target.IsValid(), "Target is valid")
# This should create a breakpoint in the stepping thread.
breakpoint = target.BreakpointCreateByName("main")
self.assertTrue(breakpoint and breakpoint.IsValid(), "Breakpoint is valid")
# Run the program.
process = target.LaunchSimple(None, None, self.get_process_working_directory())
self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
# The stop reason of the thread should be breakpoint.
self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint)
self.assertEquals(len(threads), 1, STOPPED_DUE_TO_BREAKPOINT)
thread = threads[0]
self.assertTrue(thread and thread.IsValid(), "Thread is valid")
# Make sure we see only one threads
self.assertEqual(process.GetNumThreads(), 1, 'Number of expected threads and actual threads do not match.')
# Keep stepping until we see the thread creation
while process.GetNumThreads() < 2:
thread.StepInstruction(False)
self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
self.assertEqual(thread.GetStopReason(), lldb.eStopReasonPlanComplete, "Step operation succeeded")
if self.TraceOn():
self.runCmd("disassemble --pc")
if self.TraceOn():
self.runCmd("thread list")
# We have successfully caught thread creation. Now just run to completion
process.Continue()
# At this point, the inferior process should have exited.
self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()