20from contextlib
import contextmanager
23from typing
import Optional, Sequence
25from .server
import request, capability, send_event
26from .sources
import make_source
27from .startup
import in_gdb_thread, log_stack
28from .typecheck
import type_check
48 """Return a new context manager that suppresses new breakpoint events."""
81gdb.events.breakpoint_created.connect(_bp_created)
82gdb.events.breakpoint_modified.connect(_bp_modified)
83gdb.events.breakpoint_deleted.connect(_bp_deleted)
96 "Return the Breakpoint object descriptor given a gdb Breakpoint."
108 loc = bp.locations[0]
110 (filename, line) = loc.source
111 if loc.fullname
is not None:
112 filename = loc.fullname
116 "source": make_source(filename, os.path.basename(filename)),
122 result[
"instructionReference"] = hex(loc.address)
132 return [table.pop(name,
None)
for name
in names]
140 global breakpoint_map
142 if kind
in breakpoint_map:
143 saved_map = breakpoint_map[kind]
146 breakpoint_map[kind] = {}
152 (condition, hit_condition) =
_remove_entries(spec,
"condition",
"hitCondition")
153 keyspec = frozenset(spec.items())
160 if keyspec
in saved_map:
161 bp = saved_map.pop(keyspec)
166 bp.condition = condition
167 if hit_condition
is None:
170 bp.ignore_count = int(
171 gdb.parse_and_eval(hit_condition, global_context=
True)
175 breakpoint_map[kind][keyspec] = bp
178 except Exception
as e:
193 for entry
in saved_map.values():
202 self.
message = re.split(
"{(.*?)}", logMessage)
206 for idx, item
in enumerate(self.
message):
215 val = gdb.parse_and_eval(item)
217 except Exception
as e:
218 output +=
"<" + str(e) +
">"
222 "category":
"console",
235 if logMessage
is not None:
238 return gdb.Breakpoint(**args)
257 condition: Optional[str] =
None,
258 hitCondition: Optional[str] =
None,
259 logMessage: Optional[str] =
None,
263 "source": source[
"path"],
265 "condition": condition,
266 "hitCondition": hitCondition,
267 "logMessage": logMessage,
272@request("setBreakpoints")
273@capability("supportsHitConditionalBreakpoints")
274@capability("supportsConditionalBreakpoints")
275@capability("supportsLogPoints")
277 if "path" not in source:
284 for bp
in breakpoints:
285 bp[
"source"] = source
289 key =
"source:" + source[
"path"]
292 "breakpoints": result,
303 condition: Optional[str] =
None,
304 hitCondition: Optional[str] =
None,
309 "condition": condition,
310 "hitCondition": hitCondition,
314@request("setFunctionBreakpoints")
315@capability("supportsFunctionBreakpoints")
329 instructionReference: str,
330 offset: Optional[int] =
None,
331 condition: Optional[str] =
None,
332 hitCondition: Optional[str] =
None,
337 val =
"*" + instructionReference
338 if offset
is not None:
339 val = val +
" + " + str(offset)
342 "condition": condition,
343 "hitCondition": hitCondition,
347@request("setInstructionBreakpoints")
348@capability("supportsInstructionBreakpoints")
350 *, breakpoints: Sequence, offset: Optional[int] =
None, **args
360 if filterId
in (
"assert",
"exception",
"throw",
"rethrow",
"catch"):
361 cmd =
"-catch-" + filterId
363 raise Exception(
"Invalid exception filterID: " + str(filterId))
364 result = gdb.execute_mi(cmd)
366 for bp
in gdb.breakpoints():
367 if bp.number == result[
"bkptno"]:
369 raise Exception(
"Could not find catchpoint after creating")
384 condition: Optional[str] =
None,
389 "filterId": filterId,
390 "condition": condition,
394@request("setExceptionBreakpoints")
395@capability("supportsExceptionFilterOptions")
397 "exceptionBreakpointFilters",
401 "label":
"Ada assertions",
402 "supportsCondition":
True,
405 "filter":
"exception",
406 "label":
"Ada exceptions",
407 "supportsCondition":
True,
411 "label":
"C++ exceptions, when thrown",
412 "supportsCondition":
True,
416 "label":
"C++ exceptions, when re-thrown",
417 "supportsCondition":
True,
421 "label":
"C++ exceptions, when caught",
422 "supportsCondition":
True,
427 *, filters: Sequence[str], filterOptions: Sequence = (), **args
430 options = [{
"filterId": filter}
for filter
in filters]
431 options.extend(filterOptions)
__init__(self, logMessage, **args)
set_fn_breakpoint(*Sequence breakpoints, **args)
_remove_entries(table, *names)
set_insn_breakpoints(*Sequence breakpoints, Optional[int] offset=None, **args)
_set_breakpoints_callback(kind, specs, creator)
_breakpoint_descriptor(bp)
_set_breakpoints(kind, specs)
_rewrite_exception_breakpoint(*str filterId, Optional[str] condition=None, **args)
_rewrite_fn_breakpoint(*str name, Optional[str] condition=None, Optional[str] hitCondition=None, **args)
suppress_new_breakpoint_event()
_set_one_breakpoint(*logMessage=None, **args)
_set_exception_catchpoints(filter_options)
_rewrite_src_breakpoint(*source, int line, Optional[str] condition=None, Optional[str] hitCondition=None, Optional[str] logMessage=None, **args)
set_breakpoint(*source, Sequence breakpoints=(), **args)
set_exception_breakpoints(*Sequence[str] filters, Sequence filterOptions=(), **args)
_rewrite_insn_breakpoint(*str instructionReference, Optional[int] offset=None, Optional[str] condition=None, Optional[str] hitCondition=None, **args)
_catch_exception(filterId, **args)