mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
Emit DAP "process" event
DAP specifies a "process" event that is sent when a process is started or attached to. gdb was not emitting this (several DAP clients appear to ignore it entirely), but it looked easy and harmless to implement. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30473
This commit is contained in:
parent
1f6ce80388
commit
14e461bed4
@ -44,8 +44,43 @@ def _on_exit(event):
|
|||||||
send_event("terminated")
|
send_event("terminated")
|
||||||
|
|
||||||
|
|
||||||
|
# When None, a "process" event has already been sent. When a string,
|
||||||
|
# it is the "startMethod" for that event.
|
||||||
|
_process_event_kind = None
|
||||||
|
|
||||||
|
|
||||||
|
@in_gdb_thread
|
||||||
|
def send_process_event_once():
|
||||||
|
global _process_event_kind
|
||||||
|
if _process_event_kind is not None:
|
||||||
|
inf = gdb.selected_inferior()
|
||||||
|
is_local = inf.connection.type == "native"
|
||||||
|
data = {
|
||||||
|
"isLocalProcess": is_local,
|
||||||
|
"startMethod": _process_event_kind,
|
||||||
|
# Could emit 'pointerSize' here too if we cared to.
|
||||||
|
}
|
||||||
|
if inf.progspace.filename:
|
||||||
|
data["name"] = inf.progspace.filename
|
||||||
|
if is_local:
|
||||||
|
data["systemProcessId"] = inf.pid
|
||||||
|
send_event("process", data)
|
||||||
|
_process_event_kind = None
|
||||||
|
|
||||||
|
|
||||||
|
@in_gdb_thread
|
||||||
|
def expect_process(reason):
|
||||||
|
"""Indicate that DAP is starting or attaching to a process.
|
||||||
|
|
||||||
|
REASON is the "startMethod" to include in the "process" event.
|
||||||
|
"""
|
||||||
|
global _process_event_kind
|
||||||
|
_process_event_kind = reason
|
||||||
|
|
||||||
|
|
||||||
@in_gdb_thread
|
@in_gdb_thread
|
||||||
def thread_event(event, reason):
|
def thread_event(event, reason):
|
||||||
|
send_process_event_once()
|
||||||
send_event(
|
send_event(
|
||||||
"thread",
|
"thread",
|
||||||
{
|
{
|
||||||
@ -81,6 +116,7 @@ def _new_objfile(event):
|
|||||||
|
|
||||||
@in_gdb_thread
|
@in_gdb_thread
|
||||||
def _objfile_removed(event):
|
def _objfile_removed(event):
|
||||||
|
send_process_event_once()
|
||||||
if is_module(event.objfile):
|
if is_module(event.objfile):
|
||||||
send_event(
|
send_event(
|
||||||
"module",
|
"module",
|
||||||
|
@ -18,7 +18,7 @@ import gdb
|
|||||||
# These are deprecated in 3.9, but required in older versions.
|
# These are deprecated in 3.9, but required in older versions.
|
||||||
from typing import Mapping, Optional, Sequence
|
from typing import Mapping, Optional, Sequence
|
||||||
|
|
||||||
from .events import exec_and_expect_stop
|
from .events import exec_and_expect_stop, expect_process
|
||||||
from .server import request, capability
|
from .server import request, capability
|
||||||
from .startup import in_gdb_thread, exec_and_log
|
from .startup import in_gdb_thread, exec_and_log
|
||||||
|
|
||||||
@ -75,6 +75,7 @@ def attach(*, pid: Optional[int] = None, target: Optional[str] = None, **args):
|
|||||||
cmd = "target remote " + target
|
cmd = "target remote " + target
|
||||||
else:
|
else:
|
||||||
raise Exception("attach requires either 'pid' or 'target'")
|
raise Exception("attach requires either 'pid' or 'target'")
|
||||||
|
expect_process("attach")
|
||||||
exec_and_log(cmd)
|
exec_and_log(cmd)
|
||||||
|
|
||||||
|
|
||||||
@ -83,6 +84,7 @@ def attach(*, pid: Optional[int] = None, target: Optional[str] = None, **args):
|
|||||||
def config_done(**args):
|
def config_done(**args):
|
||||||
global _program
|
global _program
|
||||||
if _program is not None:
|
if _program is not None:
|
||||||
|
expect_process("process")
|
||||||
# Suppress the continue event, but don't set any particular
|
# Suppress the continue event, but don't set any particular
|
||||||
# expected stop.
|
# expected stop.
|
||||||
exec_and_expect_stop("run", None)
|
exec_and_expect_stop("run", None)
|
||||||
|
@ -42,6 +42,8 @@ dap_check_request_and_response "set conditional breakpoint" \
|
|||||||
[list s $srcfile] $line]
|
[list s $srcfile] $line]
|
||||||
|
|
||||||
dap_check_request_and_response "start inferior" configurationDone
|
dap_check_request_and_response "start inferior" configurationDone
|
||||||
|
dap_wait_for_event_and_check "process event generated" process \
|
||||||
|
"body startMethod" process
|
||||||
dap_wait_for_event_and_check "inferior started" thread "body reason" started
|
dap_wait_for_event_and_check "inferior started" thread "body reason" started
|
||||||
|
|
||||||
set resp [lindex [dap_request_and_response evaluate {o expression [s 23]}] \
|
set resp [lindex [dap_request_and_response evaluate {o expression [s 23]}] \
|
||||||
|
Loading…
Reference in New Issue
Block a user