[Lldb-commits] [lldb] r245687 - Add repro test case for bug #24530

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri Aug 21 03:38:31 PDT 2015


Author: labath
Date: Fri Aug 21 05:38:31 2015
New Revision: 245687

URL: http://llvm.org/viewvc/llvm-project?rev=245687&view=rev
Log:
Add repro test case for bug #24530

Modified:
    lldb/trunk/test/functionalities/signal/raise/TestRaise.py

Modified: lldb/trunk/test/functionalities/signal/raise/TestRaise.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/signal/raise/TestRaise.py?rev=245687&r1=245686&r2=245687&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/signal/raise/TestRaise.py (original)
+++ lldb/trunk/test/functionalities/signal/raise/TestRaise.py Fri Aug 21 05:38:31 2015
@@ -8,11 +8,11 @@ import lldbutil
 import re
 
 
+ at skipIfWindows # signals do not exist on Windows
 class RaiseTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @skipIfWindows # signals do not exist on Windows
     @skipUnlessDarwin
     @dsym_test
     @expectedFailureDarwin("llvm.org/pr23610") # process doesn't stop at a breakpoint on the third launch
@@ -21,7 +21,6 @@ class RaiseTestCase(TestBase):
         self.signal_test('SIGSTOP', False)
         # passing of SIGSTOP is not correctly handled, so not testing that scenario: https://llvm.org/bugs/show_bug.cgi?id=23574
 
-    @skipIfWindows # signals do not exist on Windows
     @dwarf_test
     @expectedFailureDarwin("llvm.org/pr23610") # process doesn't stop at a breakpoint on the third launch
     def test_sigstop_with_dwarf(self):
@@ -29,7 +28,6 @@ class RaiseTestCase(TestBase):
         self.signal_test('SIGSTOP', False)
         # passing of SIGSTOP is not correctly handled, so not testing that scenario: https://llvm.org/bugs/show_bug.cgi?id=23574
 
-    @skipIfWindows # signals do not exist on Windows
     @dwarf_test
     @skipIfDarwin # darwin does not support real time signals
     @skipIfTargetAndroid()
@@ -158,6 +156,89 @@ class RaiseTestCase(TestBase):
         # reset signal handling to default
         self.set_handle(signal, default_pass, default_stop, default_notify)
 
+    @dwarf_test
+    @expectedFailureLinux("llvm.org/pr24530") # the signal the inferior generates gets lost
+    @expectedFailureDarwin("llvm.org/pr24530") # the signal the inferior generates gets lost
+    def test_restart_bug_with_dwarf(self):
+        self.buildDwarf()
+        self.restart_bug_test()
+
+    @dsym_test
+    @expectedFailureDarwin("llvm.org/pr24530") # the signal the inferior generates gets lost
+    def test_restart_bug_with_dsym(self):
+        self.buildDsym()
+        self.restart_bug_test()
+
+    def restart_bug_test(self):
+        """Test that we catch a signal in the edge case where the process receives it while we are
+        about to interrupt it"""
+
+        exe = os.path.join(os.getcwd(), "a.out")
+
+        # Create a target by the debugger.
+        target = self.dbg.CreateTarget(exe)
+        self.assertTrue(target, VALID_TARGET)
+        bkpt = target.BreakpointCreateByName("main")
+        self.assertTrue(bkpt.IsValid(), VALID_BREAKPOINT)
+
+        # launch the inferior and don't wait for it to stop
+        self.dbg.SetAsync(True)
+        error = lldb.SBError()
+        listener = lldb.SBListener("my listener")
+        process = target.Launch (listener,
+                ["SIGSTOP"], # argv
+                None,        # envp
+                None,        # stdin_path
+                None,        # stdout_path
+                None,        # stderr_path
+                None,        # working directory
+                0,           # launch flags
+                False,       # Stop at entry
+                error)       # error
+
+        self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
+
+        event = lldb.SBEvent()
+
+        # Give the child enough time to reach the breakpoint,
+        # while clearing out all the pending events.
+        # The last WaitForEvent call will time out after 2 seconds.
+        while listener.WaitForEvent(2, event):
+            if self.TraceOn():
+                print "Process changing state to:", self.dbg.StateAsCString(process.GetStateFromEvent(event))
+
+        # now the process should be stopped
+        self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
+        self.assertEqual(len(lldbutil.get_threads_stopped_at_breakpoint(process, bkpt)), 1,
+                "A thread should be stopped at breakpoint")
+
+        # Remove all breakpoints. This makes sure we don't have to single-step over them when we
+        # resume the process below
+        target.DeleteAllBreakpoints()
+
+        # resume the process and immediately try to set another breakpoint. When using the remote
+        # stub, this will trigger a request to stop the process just as it is about to stop
+        # naturally due to a SIGSTOP signal it raises. Make sure we do not lose this signal.
+        process.Continue()
+        self.assertTrue(target.BreakpointCreateByName("handler").IsValid(), VALID_BREAKPOINT)
+
+        # Clear the events again
+        while listener.WaitForEvent(2, event):
+            if self.TraceOn():
+                print "Process changing state to:", self.dbg.StateAsCString(process.GetStateFromEvent(event))
+
+        # The process should be stopped due to a signal
+        self.assertEqual(process.GetState(), lldb.eStateStopped)
+        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonSignal)
+        self.assertTrue(thread.IsValid(), "Thread should be stopped due to a signal")
+        self.assertTrue(thread.GetStopReasonDataCount() >= 1, "There was data in the event.")
+        signo = process.GetUnixSignals().GetSignalNumberFromName("SIGSTOP")
+        self.assertEqual(thread.GetStopReasonDataAtIndex(0), signo,
+                "The stop signal was %s" % signal)
+
+        # We are done
+        process.Kill()
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()




More information about the lldb-commits mailing list