| """ | |
| Test that 'gui' does not crash when adding new threads, which | |
| populate TreeItem's children and may be reallocated elsewhere. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test.lldbpexpect import PExpectTest | |
| import sys | |
| @skipIfTargetDoesNotSupportThreads() | |
| class TestGuiSpawnThreadsTest(PExpectTest): | |
| # PExpect uses many timeouts internally and doesn't play well | |
| # under ASAN on a loaded machine.. | |
| @skipIfAsan | |
| @skipIfCursesSupportMissing | |
| def test_gui(self): | |
| self.build() | |
| self.launch(executable=self.getBuildArtifact("a.out"), dimensions=(100, 500)) | |
| self.expect( | |
| 'breakpoint set -f main.cpp -p "break here"', | |
| substrs=["Breakpoint 1", "address ="], | |
| ) | |
| self.expect( | |
| 'breakpoint set -f main.cpp -p "before join"', | |
| substrs=["Breakpoint 2", "address ="], | |
| ) | |
| self.expect("run", substrs=["stop reason ="]) | |
| escape_key = chr(27).encode() | |
| # Start the GUI | |
| self.child.sendline("gui") | |
| self.child.expect_exact("Threads") | |
| self.child.expect_exact(f"thread #1: tid =") | |
| for i in range(5): | |
| # Stopped at the breakpoint, continue over the thread creation | |
| self.child.send("c") | |
| # Check the newly created thread | |
| self.child.expect_exact(f"thread #{i + 2}: tid =") | |
| # Exit GUI. | |
| self.child.send(escape_key) | |
| self.expect_prompt() | |
| self.quit() |