This ensures it is run regardless of the method we use to initiate the session (previous version did not handle connects), and it is the same place that is used for resetting watchpoints. Differential Revision: https://reviews.llvm.org/D134882
120 lines
4.5 KiB
Python
120 lines
4.5 KiB
Python
import lldb
|
|
import binascii
|
|
import os
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.gdbclientutils import *
|
|
from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
|
|
|
|
|
|
@skipIfRemote
|
|
class TestProcessConnect(GDBRemoteTestBase):
|
|
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
|
|
def test_gdb_remote_sync(self):
|
|
"""Test the gdb-remote command in synchronous mode"""
|
|
try:
|
|
self.dbg.SetAsync(False)
|
|
self.expect("gdb-remote " + self.server.get_connect_address(),
|
|
substrs=['Process', 'stopped'])
|
|
finally:
|
|
self.dbg.GetSelectedTarget().GetProcess().Kill()
|
|
|
|
def test_gdb_remote_async(self):
|
|
"""Test the gdb-remote command in asynchronous mode"""
|
|
try:
|
|
self.dbg.SetAsync(True)
|
|
self.expect("gdb-remote " + self.server.get_connect_address(),
|
|
matching=False,
|
|
substrs=['Process', 'stopped'])
|
|
lldbutil.expect_state_changes(self, self.dbg.GetListener(),
|
|
self.process(), [lldb.eStateStopped])
|
|
finally:
|
|
self.dbg.GetSelectedTarget().GetProcess().Kill()
|
|
lldbutil.expect_state_changes(self, self.dbg.GetListener(),
|
|
self.process(), [lldb.eStateExited])
|
|
|
|
@skipIfWindows
|
|
def test_process_connect_sync(self):
|
|
"""Test the gdb-remote command in synchronous mode"""
|
|
try:
|
|
self.dbg.SetAsync(False)
|
|
self.expect("platform select remote-gdb-server",
|
|
substrs=['Platform: remote-gdb-server', 'Connected: no'])
|
|
self.expect("process connect " + self.server.get_connect_url(),
|
|
substrs=['Process', 'stopped'])
|
|
finally:
|
|
self.dbg.GetSelectedTarget().GetProcess().Kill()
|
|
|
|
@skipIfWindows
|
|
def test_process_connect_async(self):
|
|
"""Test the gdb-remote command in asynchronous mode"""
|
|
try:
|
|
self.dbg.SetAsync(True)
|
|
self.expect("platform select remote-gdb-server",
|
|
substrs=['Platform: remote-gdb-server', 'Connected: no'])
|
|
self.expect("process connect " + self.server.get_connect_url(),
|
|
matching=False,
|
|
substrs=['Process', 'stopped'])
|
|
lldbutil.expect_state_changes(self, self.dbg.GetListener(),
|
|
self.process(), [lldb.eStateStopped])
|
|
finally:
|
|
self.dbg.GetSelectedTarget().GetProcess().Kill()
|
|
lldbutil.expect_state_changes(self, self.dbg.GetListener(),
|
|
self.process(), [lldb.eStateExited])
|
|
def test_breakpoint_count(self):
|
|
"""
|
|
Test that breakpoint count gets reset for each new connection.
|
|
"""
|
|
class MyResponder(MockGDBServerResponder):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.continued = False
|
|
|
|
def qfThreadInfo(self):
|
|
return "m47"
|
|
|
|
def qsThreadInfo(self):
|
|
return "l"
|
|
|
|
def setBreakpoint(self, packet):
|
|
return "OK"
|
|
|
|
def readRegister(self, reg):
|
|
# Pretend we're at the breakpoint after we've been resumed.
|
|
return "3412000000000000" if self.continued else "4747000000000000"
|
|
|
|
def cont(self):
|
|
self.continued = True
|
|
return "T05thread=47;reason:breakpoint"
|
|
|
|
# Connect to the first process and set our breakpoint.
|
|
self.server.responder = MyResponder()
|
|
target = self.createTarget("a.yaml")
|
|
process = self.connect(target)
|
|
|
|
bkpt = target.BreakpointCreateByAddress(0x1234)
|
|
self.assertTrue(bkpt.IsValid())
|
|
self.assertEqual(bkpt.GetNumLocations(), 1)
|
|
|
|
# "continue" the process. It should hit our breakpoint.
|
|
process.Continue()
|
|
self.assertState(process.GetState(), lldb.eStateStopped)
|
|
self.assertEqual(bkpt.GetHitCount(), 1)
|
|
|
|
# Now kill it. The breakpoint should still show a hit count of one.
|
|
process.Kill()
|
|
self.server.stop()
|
|
self.assertEqual(bkpt.GetHitCount(), 1)
|
|
|
|
# Start over, and reconnect.
|
|
self.server = MockGDBServer(self.server_socket_class())
|
|
self.server.start()
|
|
|
|
process = self.connect(target)
|
|
|
|
# The hit count should be reset.
|
|
self.assertEqual(bkpt.GetHitCount(), 0)
|