1*9c95617cSMichael Buch"""Test that lldb command 'process signal SIGUSR1' to send a signal to the inferior works.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprecht 499451b44SJordan Rupprechtimport lldb 599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht 1099451b44SJordan Rupprechtclass SendSignalTestCase(TestBase): 1199451b44SJordan Rupprecht def setUp(self): 1299451b44SJordan Rupprecht # Call super's setUp(). 1399451b44SJordan Rupprecht TestBase.setUp(self) 1499451b44SJordan Rupprecht # Find the line number to break inside main(). 152238dcc3SJonas Devlieghere self.line = line_number("main.c", "Put breakpoint here") 1699451b44SJordan Rupprecht 172238dcc3SJonas Devlieghere @expectedFailureNetBSD(bugnumber="llvm.org/pr43959") 1899451b44SJordan Rupprecht @skipIfWindows # Windows does not support signals 1999451b44SJordan Rupprecht def test_with_run_command(self): 2099451b44SJordan Rupprecht """Test that lldb command 'process signal SIGUSR1' sends a signal to the inferior process.""" 2199451b44SJordan Rupprecht self.build() 2299451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht # Create a target by the debugger. 2599451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2699451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # Now create a breakpoint on main.c by name 'c'. 292238dcc3SJonas Devlieghere breakpoint = target.BreakpointCreateByLocation("main.c", self.line) 302238dcc3SJonas Devlieghere self.assertTrue( 312238dcc3SJonas Devlieghere breakpoint and breakpoint.GetNumLocations() == 1, VALID_BREAKPOINT 322238dcc3SJonas Devlieghere ) 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht # Get the breakpoint location from breakpoint after we verified that, 3599451b44SJordan Rupprecht # indeed, it has one location. 3699451b44SJordan Rupprecht location = breakpoint.GetLocationAtIndex(0) 372238dcc3SJonas Devlieghere self.assertTrue(location and location.IsEnabled(), VALID_BREAKPOINT_LOCATION) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht # Now launch the process, no arguments & do not stop at entry point. 4086aa8e63SJonas Devlieghere launch_info = target.GetLaunchInfo() 4199451b44SJordan Rupprecht launch_info.SetWorkingDirectory(self.get_process_working_directory()) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht process_listener = lldb.SBListener("signal_test_listener") 4499451b44SJordan Rupprecht launch_info.SetListener(process_listener) 4599451b44SJordan Rupprecht error = lldb.SBError() 4699451b44SJordan Rupprecht process = target.Launch(launch_info, error) 4799451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht self.runCmd("process handle -n False -p True -s True SIGUSR1") 5099451b44SJordan Rupprecht 512238dcc3SJonas Devlieghere thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) 5299451b44SJordan Rupprecht self.assertTrue(thread.IsValid(), "We hit the first breakpoint.") 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht # After resuming the process, send it a SIGUSR1 signal. 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht self.setAsync(True) 5799451b44SJordan Rupprecht 582238dcc3SJonas Devlieghere self.assertTrue(process_listener.IsValid(), "Got a good process listener") 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht # Disable our breakpoint, we don't want to hit it anymore... 6199451b44SJordan Rupprecht breakpoint.SetEnabled(False) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # Now continue: 6499451b44SJordan Rupprecht process.Continue() 6599451b44SJordan Rupprecht 6699451b44SJordan Rupprecht self.match_state(process_listener, lldb.eStateRunning) 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht # Now signal the process, and make sure it stops: 692238dcc3SJonas Devlieghere process.Signal(lldbutil.get_signal_number("SIGUSR1")) 7099451b44SJordan Rupprecht 7199451b44SJordan Rupprecht self.match_state(process_listener, lldb.eStateStopped) 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht # Now make sure the thread was stopped with a SIGUSR1: 7499451b44SJordan Rupprecht threads = lldbutil.get_stopped_threads(process, lldb.eStopReasonSignal) 7580fcecb1SJonas Devlieghere self.assertEqual(len(threads), 1, "One thread stopped for a signal.") 7699451b44SJordan Rupprecht thread = threads[0] 7799451b44SJordan Rupprecht 789c246882SJordan Rupprecht self.assertGreaterEqual( 799c246882SJordan Rupprecht thread.GetStopReasonDataCount(), 1, "There was data in the event." 802238dcc3SJonas Devlieghere ) 810ed758b2SDave Lee self.assertEqual( 822238dcc3SJonas Devlieghere thread.GetStopReasonDataAtIndex(0), 832238dcc3SJonas Devlieghere lldbutil.get_signal_number("SIGUSR1"), 842238dcc3SJonas Devlieghere "The stop signal was SIGUSR1", 852238dcc3SJonas Devlieghere ) 8699451b44SJordan Rupprecht 872238dcc3SJonas Devlieghere self.match("statistics dump", [r'"signals": \[', r'"SIGUSR1": 1']) 8813005564SGreg Clayton 8999451b44SJordan Rupprecht def match_state(self, process_listener, expected_state): 9099451b44SJordan Rupprecht num_seconds = 5 9199451b44SJordan Rupprecht broadcaster = self.process().GetBroadcaster() 9299451b44SJordan Rupprecht event_type_mask = lldb.SBProcess.eBroadcastBitStateChanged 9399451b44SJordan Rupprecht event = lldb.SBEvent() 9499451b44SJordan Rupprecht got_event = process_listener.WaitForEventForBroadcasterWithType( 952238dcc3SJonas Devlieghere num_seconds, broadcaster, event_type_mask, event 962238dcc3SJonas Devlieghere ) 9799451b44SJordan Rupprecht self.assertTrue(got_event, "Got an event") 9899451b44SJordan Rupprecht state = lldb.SBProcess.GetStateFromEvent(event) 9980fcecb1SJonas Devlieghere self.assertEqual( 1002238dcc3SJonas Devlieghere state, 1012238dcc3SJonas Devlieghere expected_state, 1022238dcc3SJonas Devlieghere "It was the %s state." % lldb.SBDebugger.StateAsCString(expected_state), 1032238dcc3SJonas Devlieghere ) 104