aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2021-11-26 13:51:36 +0000
committerAndrew Burgess <aburgess@redhat.com>2022-01-12 11:19:48 +0000
commit393707788800b05448201fbb184ba758e26960fd (patch)
tree678f039f2aa09dc16899e259c3530bfe6044a5aa /gdb
parent8864ef428d92e58b48ec11136d3b91622345c838 (diff)
downloadgdb-393707788800b05448201fbb184ba758e26960fd.zip
gdb-393707788800b05448201fbb184ba758e26960fd.tar.gz
gdb-393707788800b05448201fbb184ba758e26960fd.tar.bz2
gdb: new 'maint flush source-cache' command
This commit adds a new 'maint flush source-cache' command, this flushes the cache of source file contents. After flushing GDB is forced to reread source files the next time any source lines are to be displayed. 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. 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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/NEWS3
-rw-r--r--gdb/doc/gdb.texinfo13
-rw-r--r--gdb/source-cache.c14
-rw-r--r--gdb/testsuite/gdb.base/cached-source-file.exp38
4 files changed, 68 insertions, 0 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index ad80e92..73eb022 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.
+maint flush source-cache
+ Flush the contents of the source code cache.
+
* Changed commands
maint packet
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index e39815d..2864950 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -39473,6 +39473,19 @@ frame cache. This command is useful when debugging issues related to
register fetching, or frame unwinding. The command @code{flushregs}
is deprecated in favor of @code{maint flush register-cache}.
+@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 fc789ee..0650768 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"
#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);
}
+/* 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 d4e64f3..75a1337 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-marker \\\*/.*" \
"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] != -1 } {
+ if { [string first "new-marker" $line] != -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"