aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/NEWS5
-rw-r--r--gdb/doc/gdb.texinfo18
-rw-r--r--gdb/python/lib/gdb/dap/breakpoint.py6
-rw-r--r--gdb/python/lib/gdb/dap/server.py10
-rw-r--r--gdb/python/lib/gdb/dap/startup.py31
5 files changed, 64 insertions, 6 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index 3c17d09..4358494 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -90,6 +90,11 @@ show remote thread-options-packet
** The "attach" request now supports specifying the program.
+ ** New command "set debug dap-log-level" controls DAP logging.
+
+ ** The "set debug dap-log-file" command is now documented. This
+ command was available in GDB 14 but not documented.
+
* New remote packets
New stop reason: clone
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 3cb7682..42a9123 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -39644,6 +39644,24 @@ Evaluations like this can be interrupted using the DAP @code{cancel}
request. (In fact, @code{cancel} should work for any request, but it
is unlikely to be useful for most of them.)
+@value{GDBN} provides a couple of logging settings that can be used in
+DAP mode. These can be set on the command line using the @code{-iex}
+option (@pxref{File Options}).
+
+@table @code
+@item set debug dap-log-file @r{[}@var{filename}@r{]}
+Enable DAP logging. Logs are written to @var{filename}. If no
+@var{filename} is given, logging is stopped.
+
+@item set debug dap-log-level @var{level}
+Set the DAP logging level. The default is @samp{1}, which logs the
+DAP protocol, whatever debug messages the developers thought were
+useful, and unexpected exceptions. Level @samp{2} can be used to log
+all exceptions, including ones that are considered to be expected.
+For example, a failure to parse an expression would be considered a
+normal exception and not normally be logged.
+@end table
+
@node JIT Interface
@chapter JIT Compilation Interface
@cindex just-in-time compilation
diff --git a/gdb/python/lib/gdb/dap/breakpoint.py b/gdb/python/lib/gdb/dap/breakpoint.py
index c67bb47..6741420 100644
--- a/gdb/python/lib/gdb/dap/breakpoint.py
+++ b/gdb/python/lib/gdb/dap/breakpoint.py
@@ -24,7 +24,7 @@ from typing import Optional, Sequence
from .server import request, capability, send_event
from .sources import make_source
-from .startup import in_gdb_thread, log_stack, parse_and_eval, DAPException
+from .startup import in_gdb_thread, log_stack, parse_and_eval, LogLevel, DAPException
from .typecheck import type_check
@@ -176,7 +176,9 @@ def _set_breakpoints_callback(kind, specs, creator):
result.append(_breakpoint_descriptor(bp))
# Exceptions other than gdb.error are possible here.
except Exception as e:
- log_stack()
+ # Don't normally want to see this, as it interferes with
+ # the test suite.
+ log_stack(LogLevel.FULL)
# Maybe the breakpoint was made but setting an attribute
# failed. We still want this to fail.
if bp is not None:
diff --git a/gdb/python/lib/gdb/dap/server.py b/gdb/python/lib/gdb/dap/server.py
index 44dffb1..59fad59 100644
--- a/gdb/python/lib/gdb/dap/server.py
+++ b/gdb/python/lib/gdb/dap/server.py
@@ -23,6 +23,7 @@ import threading
from .io import start_json_writer, read_json
from .startup import (
exec_and_log,
+ DAPException,
DAPQueue,
in_dap_thread,
in_gdb_thread,
@@ -31,6 +32,7 @@ from .startup import (
start_thread,
log,
log_stack,
+ LogLevel,
)
from .typecheck import type_check
@@ -139,12 +141,20 @@ class Server:
result["body"] = body
result["success"] = True
except NotStoppedException:
+ # This is an expected exception, and the result is clearly
+ # visible in the log, so do not log it.
result["success"] = False
result["message"] = "notStopped"
except KeyboardInterrupt:
# This can only happen when a request has been canceled.
result["success"] = False
result["message"] = "cancelled"
+ except DAPException as e:
+ # Don't normally want to see this, as it interferes with
+ # the test suite.
+ log_stack(LogLevel.FULL)
+ result["success"] = False
+ result["message"] = str(e)
except BaseException as e:
log_stack()
result["success"] = False
diff --git a/gdb/python/lib/gdb/dap/startup.py b/gdb/python/lib/gdb/dap/startup.py
index 64a4659..761b292 100644
--- a/gdb/python/lib/gdb/dap/startup.py
+++ b/gdb/python/lib/gdb/dap/startup.py
@@ -22,6 +22,7 @@ import threading
import traceback
import sys
+from enum import IntEnum, auto
# Adapt to different Queue types. This is exported for use in other
# modules as well.
@@ -101,6 +102,28 @@ def in_dap_thread(func):
return ensure_dap_thread
+# Logging levels.
+class LogLevel(IntEnum):
+ DEFAULT = auto()
+ FULL = auto()
+
+
+class LogLevelParam(gdb.Parameter):
+ """DAP logging level."""
+
+ set_doc = "Set the DAP logging level."
+ show_doc = "Show the DAP logging level."
+
+ def __init__(self):
+ super().__init__(
+ "debug dap-log-level", gdb.COMMAND_MAINTENANCE, gdb.PARAM_ZUINTEGER
+ )
+ self.value = LogLevel.DEFAULT
+
+
+_log_level = LogLevelParam()
+
+
class LoggingParam(gdb.Parameter):
"""Whether DAP logging is enabled."""
@@ -128,16 +151,16 @@ class LoggingParam(gdb.Parameter):
dap_log = LoggingParam()
-def log(something):
+def log(something, level=LogLevel.DEFAULT):
"""Log SOMETHING to the log file, if logging is enabled."""
- if dap_log.log_file is not None:
+ if dap_log.log_file is not None and level <= _log_level.value:
print(something, file=dap_log.log_file)
dap_log.log_file.flush()
-def log_stack():
+def log_stack(level=LogLevel.DEFAULT):
"""Log a stack trace to the log file, if logging is enabled."""
- if dap_log.log_file is not None:
+ if dap_log.log_file is not None and level <= _log_level.value:
traceback.print_exc(file=dap_log.log_file)