Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#1349] Always use --simple-values in newer versions of GDB. #1400

Merged
merged 2 commits into from
May 30, 2023

Conversation

gareth-rees
Copy link
Contributor

@gareth-rees gareth-rees commented May 9, 2023

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 in DebuggedProcess.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 the DebuggedProcess 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.

Command Counts (main) Counts (this branch)
-stack-list-arguments 2 2
-stack-list-frames 1 1
-stack-list-variables 1 1
-stack-select-frame 20 0
-var-create 210 10
-var-delete 210 10

@gareth-rees
Copy link
Contributor Author

@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.

Copy link
Member

@gregg-miskelly gregg-miskelly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otherwise sounds good to me

src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs Outdated Show resolved Hide resolved
src/MIDebugEngine/Engine.Impl/DebuggedProcess.cs Outdated Show resolved Hide resolved
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` in `DebuggedProcess.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 the `DebuggedProcess` object as the set
of supported features does not change during the lifetime of the debug
session.
@gregg-miskelly
Copy link
Member

gregg-miskelly commented May 26, 2023

@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.

@WardenGnaw
Copy link
Member

LGTM. Linux tests are just being flaky and not failing due to the changes.

Thanks again for contributing @gareth-rees!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants