Closed gareth-rees closed 1 year ago
@gregg-miskelly You looked at my previous attempt to fix this issue, pull request #1350, so it would valuable if you could take a look at this attempt too.
@WardenGnaw do you want to take a look as well? These look good to me.
@gareth-rees FYI WardenGnaw is on vacation, and Monday is a holiday in the US, so we probably will not get back to you till Tuesday or Wednesday.
LGTM. Linux tests are just being flaky and not failing due to the changes.
Thanks again for contributing @gareth-rees!
Summary
In newer versions of GDB, the
--simple-values
option to the-stack-list-arguments
,-stack-list-locals
and-stack-list-variables
commands no longer prints the value for references to compound types. This improves the performance of these commands when the stack has references to large data structures.When these versions of GDB are available, take advantage by using
--simple-values
inDebuggedProcess.GetParameterInfoOnly
to fetch names and types in a single-stack-list-arguments
command. This is faster than the old approach of using--no-values
followed with-var-create
and-var-delete
for each parameter to get the type.The new method
MICommandFactory.SupportsSimpleValuesExcludesRefTypes
determines if the debugger supports the improved behaviour of the--simple-values
option, by executing the-list-features
command and checking for the"simple-values-ref-types"
feature in the output. We cache the result on theDebuggedProcess
object as the set of supported features does not change during the lifetime of the debug session.Fixes #1349 (Unnecessary
-var-create
and-var-delete
commands during a stack trace can cause noticeable pause each time the debuggee stops)Details
The behaviour of GDB was changed in commit 51f8dafba8 and this change will be included in the next major release of GDB (version 14). I understand that Microsoft developers are not allowed to look at GDB's source code (see comment from Gregg Miskelly here), so I have summarized the effect of the change above. Let me know if there is anything else you'd like to know about this change.
I repeated the reproduction procedure from #1349, took a copy of the commands issued by a single Step Over operation with ten frames on the stack and attached them here: stack-list-arguments-after.gz. The table below shows the counts of GDB/MI commands issued for the Step Over operation by the MIEngine from
main
against GDB 13.1 and the MIEngine from this branch against the updated GDB.-stack-list-arguments
-stack-list-frames
-stack-list-variables
-stack-select-frame
-var-create
-var-delete