Before this patch, any time TreeItem is copied in Resize method, its parent is not updated, which can cause crashes when, for example, thread window with multiple hierarchy levels is updated. Makes TreeItem move-only, removes TreeItem's m_delegate extra self-assignment by making it a pointer, adds code to fix up children's parent on move constructor and operator= Patch prepared by NH5pml30 ~~~ Huawei RRI, OS Lab Reviewed By: clayborg Differential Revision: https://reviews.llvm.org/D157960
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
"""
|
|
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
|
|
|
|
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()
|