brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.2 KiB · 9dc73b9 Raw
167 lines · python
1import lldb2from lldbsuite.test.lldbtest import *3from lldbsuite.test import lldbutil4from lldbsuite.test.decorators import *5 6 7class TestProcessHandle(TestBase):8    @no_debug_info_test9    @skipIfWindows10    def test_process_handle(self):11        """Test that calling process handle before we have a target, and before we12        have a process will affect the process.  Also that the signal settings13        are preserved on rerun."""14        self.build()15 16        # Make sure we don't accept signal values by signo with no process - we don't know what the17        # mapping will be so we can't do the right thing with bare numbers:18        lldbutil.set_actions_for_signal(19            self, "9", "true", None, None, expect_success=False20        )21 22        # First, I need a reference value so I can see whether changes actually took:23        (target, process, _, bkpt) = lldbutil.run_to_source_breakpoint(24            self, "// break here", lldb.SBFileSpec("main.cpp")25        )26        (default_pass, default_stop, default_notify) = lldbutil.get_actions_for_signal(27            self, "SIGSEGV"28        )29 30        # Let's change the value here, then exit and make sure the changed value sticks:31        new_value = "false"32        if default_pass == "true":33            new_value = "false"34 35        # First make sure we get an error for bogus values when running:36        lldbutil.set_actions_for_signal(37            self, "NOTSIGSEGV", new_value, None, None, expect_success=False38        )39 40        # Then set the one we intend to change.41        lldbutil.set_actions_for_signal(self, "SIGSEGV", new_value, None, None)42 43        process.Continue()44 45        self.assertState(process.GetState(), lldb.eStateExited)46        self.assertEqual(process.GetExitStatus(), 0)47 48        # Check that we preserved the setting:49        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(50            self, "SIGSEGV", from_target=True51        )52        self.assertEqual(curr_pass, new_value, "Pass was set correctly")53        self.assertEqual(curr_stop, "not set", "Stop was not set by us")54        self.assertEqual(curr_notify, "not set", "Notify was not set by us")55 56        # Run again and make sure that we prime the new process with these settings:57        process = lldbutil.run_to_breakpoint_do_run(self, target, bkpt)58 59        # We check the process settings now, to see what got copied into the process:60        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(61            self, "SIGSEGV"62        )63        self.assertEqual(curr_pass, new_value, "Pass was set correctly")64        self.assertEqual(curr_stop, default_stop, "Stop was its default value")65        self.assertEqual(curr_notify, default_notify, "Notify was its default value")66 67        # Now kill this target, set the handling and make sure the values get copied from the dummy into the new target.68        success = self.dbg.DeleteTarget(target)69        self.assertTrue(success, "Deleted the target")70        self.assertEqual(self.dbg.GetNumTargets(), 0, "We did delete all the targets.")71 72        # The signal settings should be back at their default - we were only setting this on the target:73        lldbutil.get_actions_for_signal(74            self, "SIGSEGV", from_target=True, expected_absent=True75        )76        # Set a valid one:77        lldbutil.set_actions_for_signal(self, "SIGSEGV", new_value, None, None)78        # Set a bogus one - we don't have a way to check pre-run so this is allowed79        # but we should get an error message when launching:80        lldbutil.set_actions_for_signal(self, "SIGNOTSIG", new_value, None, None)81 82        out_filename = self.getBuildArtifact("output")83        success = True84        try:85            f = open(out_filename, "w")86        except:87            success = False88 89        if not success:90            self.fail("Couldn't open error output file for writing.")91 92        self.dbg.SetErrorFileHandle(f, False)93        # Now make a new process and make sure the right values got copied into the new target94        (target, process, _, bkpt) = lldbutil.run_to_source_breakpoint(95            self, "// break here", lldb.SBFileSpec("main.cpp")96        )97        f.write("TESTPATTERN\n")98        f.flush()99        f.close()100 101        try:102            f = open(out_filename, "r")103        except:104            success = False105 106        if not success:107            self.fail("Couldn't open error output file for reading")108        errors = f.read()109        f.close()110 111        self.assertIn("SIGNOTSIG", errors, "We warned about the unset signal")112        # Also make sure we didn't accidentally add this bogus setting to the process.113        lldbutil.set_actions_for_signal(114            self, "SIGNOTSIG", "true", "true", "true", expect_success=False115        )116 117        # Check that they went into the target:118        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(119            self, "SIGSEGV", from_target=True120        )121        self.assertEqual(curr_pass, new_value, "Pass was set correctly")122        self.assertEqual(curr_stop, "not set", "Stop was not set by us")123        self.assertEqual(curr_notify, "not set", "Notify was not set by us")124 125        # And the process:126        # Check that they went into the target:127        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(128            self, "SIGSEGV"129        )130        self.assertEqual(curr_pass, new_value, "Pass was set correctly")131        self.assertEqual(curr_stop, default_stop, "Stop was its default value")132        self.assertEqual(curr_notify, default_notify, "Notify was its default value")133 134        # Now clear the handling, and make sure that we get the right signal values again:135        self.runCmd("process handle -c SIGSEGV")136        # Check that there is no longer configuration for SIGSEGV in the target:137        lldbutil.get_actions_for_signal(138            self, "SIGSEGV", from_target=True, expected_absent=True139        )140        # Make a new process, to make sure we did indeed reset the values:141        (target, process, _, bkpt) = lldbutil.run_to_source_breakpoint(142            self, "// break here", lldb.SBFileSpec("main.cpp")143        )144        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(145            self, "SIGSEGV"146        )147        self.assertEqual(curr_pass, new_value, "Pass was set correctly")148        self.assertEqual(curr_stop, default_stop, "Stop was its default value")149        self.assertEqual(curr_notify, default_notify, "Notify was its default value")150 151        # Finally remove this from the dummy target as well, and make sure it was cleared from there:152        self.runCmd("process handle -c -d SIGSEGV")153        error = process.Kill()154        self.assertSuccess(error, "Killed the process")155        success = self.dbg.DeleteTarget(target)156        self.assertTrue(success, "Destroyed the target.")157 158        (target, process, _, bkpt) = lldbutil.run_to_source_breakpoint(159            self, "// break here", lldb.SBFileSpec("main.cpp")160        )161        (curr_pass, curr_stop, curr_notify) = lldbutil.get_actions_for_signal(162            self, "SIGSEGV"163        )164        self.assertEqual(curr_pass, default_pass, "Pass was set correctly")165        self.assertEqual(curr_stop, default_stop, "Stop was its default value")166        self.assertEqual(curr_notify, default_notify, "Notify was its default value")167