Skip to content

Commit c4202e4

Browse files
Josverlandrewleech
authored andcommitted
dap_monitor: Exit session on debugger disconnect.
Signed-off-by: Jos Verlinde <jos_verlinde@hotmail.com>
1 parent 3ed2d89 commit c4202e4

File tree

1 file changed

+48
-35
lines changed

1 file changed

+48
-35
lines changed

python-ecosys/debugpy/dap_monitor.py

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
class DAPMonitor:
1111
def __init__(self, listen_port=5679, target_host='127.0.0.1', target_port=5678):
12+
self.disconnect = False
1213
self.listen_port = listen_port
1314
self.target_host = target_host
1415
self.target_port = target_port
@@ -44,9 +45,9 @@ def start(self):
4445
threading.Thread(target=self.forward_server_to_client, daemon=True).start()
4546

4647
print("DAP Monitor active - press Ctrl+C to stop")
47-
while True:
48+
while not self.disconnect:
4849
time.sleep(1)
49-
50+
5051
except KeyboardInterrupt:
5152
print("\nStopping DAP Monitor...")
5253
except Exception as e:
@@ -106,43 +107,55 @@ def receive_dap_message(self, sock, source):
106107
return None
107108
content += chunk
108109

109-
# Log the message
110-
try:
111-
message = json.loads(content.decode('utf-8'))
112-
msg_type = message.get('type', 'unknown')
113-
command = message.get('command', message.get('event', 'unknown'))
114-
seq = message.get('seq', 0)
115-
116-
print(f"\n[{source}] {msg_type.upper()}: {command} (seq={seq})")
117-
118-
if msg_type == 'request':
119-
args = message.get('arguments', {})
120-
if args:
121-
print(f" Arguments: {json.dumps(args, indent=2)}")
122-
elif msg_type == 'response':
123-
success = message.get('success', False)
124-
req_seq = message.get('request_seq', 0)
125-
print(f" Success: {success}, Request Seq: {req_seq}")
126-
body = message.get('body')
127-
if body:
128-
print(f" Body: {json.dumps(body, indent=2)}")
129-
msg = message.get('message')
130-
if msg:
131-
print(f" Message: {msg}")
132-
elif msg_type == 'event':
133-
body = message.get('body', {})
134-
if body:
135-
print(f" Body: {json.dumps(body, indent=2)}")
136-
137-
except json.JSONDecodeError:
138-
print(f"\n[{source}] Invalid JSON: {content}")
139-
110+
# Parse and Log the message
111+
message = self.parse_dap(source, content)
112+
self.log_dap_message(source, message)
113+
# Check for disconnect command
114+
if message:
115+
if "disconnect" == message.get('command', message.get('event', 'unknown')):
116+
print(f"\n[{source}] Disconnect command received, stopping monitor.")
117+
self.disconnect = True
140118
return header + content
141-
142119
except Exception as e:
143120
print(f"Error receiving from {source}: {e}")
144121
return None
145-
122+
123+
def parse_dap(self, source, content):
124+
"""Parse DAP message and log it."""
125+
try:
126+
message = json.loads(content.decode('utf-8'))
127+
return message
128+
except json.JSONDecodeError:
129+
print(f"\n[{source}] Invalid JSON: {content}")
130+
return None
131+
132+
def log_dap_message(self, source, message):
133+
"""Log DAP message details."""
134+
msg_type = message.get('type', 'unknown')
135+
command = message.get('command', message.get('event', 'unknown'))
136+
seq = message.get('seq', 0)
137+
138+
print(f"\n[{source}] {msg_type.upper()}: {command} (seq={seq})")
139+
140+
if msg_type == 'request':
141+
args = message.get('arguments', {})
142+
if args:
143+
print(f" Arguments: {json.dumps(args, indent=2)}")
144+
elif msg_type == 'response':
145+
success = message.get('success', False)
146+
req_seq = message.get('request_seq', 0)
147+
print(f" Success: {success}, Request Seq: {req_seq}")
148+
body = message.get('body')
149+
if body:
150+
print(f" Body: {json.dumps(body, indent=2)}")
151+
msg = message.get('message')
152+
if msg:
153+
print(f" Message: {msg}")
154+
elif msg_type == 'event':
155+
body = message.get('body', {})
156+
if body:
157+
print(f" Body: {json.dumps(body, indent=2)}")
158+
146159
def send_raw_data(self, sock, data):
147160
"""Send raw data to socket."""
148161
try:

0 commit comments

Comments
 (0)