From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1726) id 9AF293858416; Wed, 12 Jan 2022 11:36:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9AF293858416 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Andrew Burgess To: gdb-cvs@sourceware.org Subject: [binutils-gdb] gdb: new 'maint flush source-cache' command X-Act-Checkin: binutils-gdb X-Git-Author: Andrew Burgess X-Git-Refname: refs/heads/master X-Git-Oldrev: 8864ef428d92e58b48ec11136d3b91622345c838 X-Git-Newrev: 393707788800b05448201fbb184ba758e26960fd Message-Id: <20220112113635.9AF293858416@sourceware.org> Date: Wed, 12 Jan 2022 11:36:35 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 Jan 2022 11:36:35 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D393707788800= b05448201fbb184ba758e26960fd commit 393707788800b05448201fbb184ba758e26960fd Author: Andrew Burgess Date: Fri Nov 26 13:51:36 2021 +0000 gdb: new 'maint flush source-cache' command =20 This commit adds a new 'maint flush source-cache' command, this flushes the cache of source file contents. =20 After flushing GDB is forced to reread source files the next time any source lines are to be displayed. =20 I've added a test for this new feature. The test is a little weird, in that it modifies a source file after compilation, and makes use of the cache flush so that the changes show up when listing the source file. I'm not sure when such a situation would ever crop up in real life, but maybe we can imagine such cases. =20 In reality, this command is useful for testing the syntax highlighting within GDB, we can adjust the syntax highlighting settings, flush the cache, and then get the file contents re-highlighted using the new settings. Diff: --- gdb/NEWS | 3 +++ gdb/doc/gdb.texinfo | 13 +++++++++ gdb/source-cache.c | 14 ++++++++++ gdb/testsuite/gdb.base/cached-source-file.exp | 38 +++++++++++++++++++++++= ++++ 4 files changed, 68 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index ad80e92700e..73eb022fcbb 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -70,6 +70,9 @@ show debug linux-nat debug lin-lwp' respectively. Turning this setting on prints debug messages relating to GDB's handling of native Linux inferiors. =20 +maint flush source-cache + Flush the contents of the source code cache. + * Changed commands =20 maint packet diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index e39815d5132..2864950959e 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -39473,6 +39473,19 @@ frame cache. This command is useful when debuggin= g issues related to register fetching, or frame unwinding. The command @code{flushregs} is deprecated in favor of @code{maint flush register-cache}. =20 +@kindex maint flush source-cache +@cindex source code, caching +@item maint flush source-cache +Flush @value{GDBN}'s cache of source code file contents. After +@value{GDBN} reads a source file, and optionally applies styling +(@pxref{Output Styling}), the file contents are cached. This command +clears that cache. The next time @value{GDBN} wants to show lines +from a source file, the content will be re-read. + +This command is useful when debugging issues related to source code +styling. After flushing the cache any source code displayed by +@value{GDBN} will be re-read and re-styled. + @kindex maint print objfiles @cindex info for known object files @item maint print objfiles @r{[}@var{regexp}@r{]} diff --git a/gdb/source-cache.c b/gdb/source-cache.c index fc789eef8f9..0650768cc0e 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -25,6 +25,7 @@ #include "gdbsupport/selftest.h" #include "objfiles.h" #include "exec.h" +#include "cli/cli-cmds.h" =20 #ifdef HAVE_SOURCE_HIGHLIGHT /* If Gnulib redirects 'open' and 'close' to its replacements @@ -323,6 +324,15 @@ source_cache::get_source_lines (struct symtab *s, int = first_line, first_line, last_line, lines); } =20 +/* Implement 'maint flush source-cache' command. */ + +static void +source_cache_flush_command (const char *command, int from_tty) +{ + forget_cached_source_info (); + printf_filtered (_("Source cache flushed.\n")); +} + #if GDB_SELF_TEST namespace selftests { @@ -346,6 +356,10 @@ void _initialize_source_cache (); void _initialize_source_cache () { + add_cmd ("source-cache", class_maintenance, source_cache_flush_command, + _("Force gdb to flush its source code cache."), + &maintenanceflushlist); + #if GDB_SELF_TEST selftests::register_test ("source-cache", selftests::extract_lines_test); #endif diff --git a/gdb/testsuite/gdb.base/cached-source-file.exp b/gdb/testsuite/= gdb.base/cached-source-file.exp index d4e64f32120..75a13378691 100644 --- a/gdb/testsuite/gdb.base/cached-source-file.exp +++ b/gdb/testsuite/gdb.base/cached-source-file.exp @@ -100,3 +100,41 @@ gdb_test "run" $re "rerun program" $q y # changed for GDB. gdb_test "list" "${bp_line}\[ \t\]+printf \\(\"foo\\\\n\"\\); /\\\* new-ma= rker \\\*/.*" \ "verify that the source code is properly reloaded" + +# Modify the source file again. As before, this only works locally +# because of the TCL commands. +set bkpsrc [standard_output_file $testfile].c.bkp +set bkpsrcfd [open $bkpsrc w] +set srcfd [open $srcfile r] + +while { [gets $srcfd line] !=3D -1 } { + if { [string first "new-marker" $line] !=3D -1 } { + # Modify the printf line that we added previously. + puts $bkpsrcfd " printf (\"foo\\n\"); /* new-marker updated */" + } else { + puts $bkpsrcfd $line + } +} + +close $bkpsrcfd +close $srcfd +file rename -force -- $bkpsrc $srcfile + +# As before, delay so that at least one second has passed. GDB still +# will not spot that the source file has changed, as GDB doesn't do a +# time check unless the binary has also changed, this delay just +# allows us to confirm this behaviour. +sleep 1 + +# List the printf line again, we should not see the file changes yet +# as the binary is unchanged, so the cached contents will still be +# used. +gdb_test "list ${bp_line}" "${bp_line}\[ \t\]+printf \\(\"foo\\\\n\"\\); /= \\\* new-marker \\\*/.*" \ + "verify that the source code change is not seen yet" + +gdb_test "maint flush source-cache" "Source cache flushed\\." + +# List the printf line again. After the cache flush GDB will re-read +# the source file and we should now see the changes. +gdb_test "list ${bp_line}" "${bp_line}\[ \t\]+printf \\(\"foo\\\\n\"\\); /= \\\* new-marker updated \\\*/.*" \ + "verify that the updated source code change is not seen"