| from __future__ import print_function |
| import lldb |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test.decorators import * |
| from gdbclientutils import * |
| |
| |
| class TestThreadSelectionBug(GDBRemoteTestBase): |
| def test(self): |
| class MyResponder(MockGDBServerResponder): |
| def cont(self): |
| # Simulate process stopping due to a raise(SIGINT) |
| return "T01reason:signal" |
| |
| self.server.responder = MyResponder() |
| target = self.createTarget("a.yaml") |
| process = self.connect(target) |
| python_os_plugin_path = os.path.join(self.getSourceDir(), |
| 'operating_system.py') |
| command = "settings set target.process.python-os-plugin-path '{}'".format( |
| python_os_plugin_path) |
| self.dbg.HandleCommand(command) |
| |
| self.assertTrue(process, PROCESS_IS_VALID) |
| self.assertEqual(process.GetNumThreads(), 3) |
| |
| # Verify our OS plug-in threads showed up |
| thread = process.GetThreadByID(0x1) |
| self.assertTrue( |
| thread.IsValid(), |
| "Make sure there is a thread 0x1 after we load the python OS plug-in") |
| thread = process.GetThreadByID(0x2) |
| self.assertTrue( |
| thread.IsValid(), |
| "Make sure there is a thread 0x2 after we load the python OS plug-in") |
| thread = process.GetThreadByID(0x3) |
| self.assertTrue( |
| thread.IsValid(), |
| "Make sure there is a thread 0x3 after we load the python OS plug-in") |
| |
| # Verify that a thread other than 3 is selected. |
| thread = process.GetSelectedThread() |
| self.assertNotEqual(thread.GetThreadID(), 0x3) |
| |
| # Verify that we select the thread backed by physical thread 1, rather |
| # than virtual thread 1. The mapping comes from the OS plugin, where we |
| # specified that thread 3 is backed by real thread 1. |
| process.Continue() |
| thread = process.GetSelectedThread() |
| self.assertEqual(thread.GetThreadID(), 0x3) |