aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-05-19 09:00:52 -0600
committerTom Tromey <tromey@adacore.com>2023-06-12 12:10:15 -0600
commit7cb909c4091c156a8242f799e18af57d702da560 (patch)
treeb7621aa9ed2cca20a509f0baca1678ab455e541f
parent3c453cfb1945eb97f68b3aca4d84f4884c564d0c (diff)
downloadgdb-7cb909c4091c156a8242f799e18af57d702da560.zip
gdb-7cb909c4091c156a8242f799e18af57d702da560.tar.gz
gdb-7cb909c4091c156a8242f799e18af57d702da560.tar.bz2
Do not report totalFrames from DAP stackTrace request
Currently, gdb will unwind the entire stack in response to the stackTrace request. I had erroneously thought that the totalFrames attribute was required in the response. However, the spec says: If omitted or if `totalFrames` is larger than the available frames, a client is expected to request frames until a request returns less frames than requested (which indicates the end of the stack). This patch removes this from the response in order to improve performance when the stack trace is very long.
-rw-r--r--gdb/python/lib/gdb/dap/bt.py12
1 files changed, 5 insertions, 7 deletions
diff --git a/gdb/python/lib/gdb/dap/bt.py b/gdb/python/lib/gdb/dap/bt.py
index a38573f..4439b42 100644
--- a/gdb/python/lib/gdb/dap/bt.py
+++ b/gdb/python/lib/gdb/dap/bt.py
@@ -50,13 +50,9 @@ def _backtrace(thread_id, levels, startFrame):
current_frame = gdb.newest_frame()
except gdb.error:
current_frame = None
- # Note that we always iterate over all frames, which is lame, but
- # seemingly necessary to support the totalFrames response.
- # FIXME maybe the mildly mysterious note about "monotonically
- # increasing totalFrames values" would let us fix this.
- while current_frame is not None:
+ while current_frame is not None and (levels == 0 or len(frames) < levels):
# This condition handles the startFrame==0 case as well.
- if current_number >= startFrame and (levels == 0 or len(frames) < levels):
+ if current_number >= startFrame:
newframe = {
"id": frame_id(current_frame),
"name": _frame_name(current_frame),
@@ -80,9 +76,11 @@ def _backtrace(thread_id, levels, startFrame):
frames.append(newframe)
current_number = current_number + 1
current_frame = current_frame.older()
+ # Note that we do not calculate totalFrames here. Its absence
+ # tells the client that it may simply ask for frames until a
+ # response yields fewer frames than requested.
return {
"stackFrames": frames,
- "totalFrames": current_number,
}