aboutsummaryrefslogtreecommitdiff
path: root/gdb/completer.c
diff options
context:
space:
mode:
authorAaron Merey <amerey@redhat.com>2025-01-21 16:09:47 -0500
committerAaron Merey <amerey@redhat.com>2025-01-24 09:57:38 -0500
commit89c07e295b6485e997e7969052aa2ecf7c811409 (patch)
treed4b1c159f76df421c65b622bbfdc0dbad92e1a67 /gdb/completer.c
parent8ce1af0a1d8ecdefcd97f006a2f584dd6fd36ea6 (diff)
downloadgdb-users/amerey/download-gdb-index.zip
gdb-users/amerey/download-gdb-index.tar.gz
gdb-users/amerey/download-gdb-index.tar.bz2
gdb/debuginfod: Add .debug_line downloadingusers/amerey/download-gdb-index
ELF/DWARF section downloading allows gdb to download .gdb_index files in order to defer full debuginfo downloads. However .gdb_index does not contain any information regarding source filenames. When a gdb command includes a filename argument (ex. 'break main.c:50'), this results in the mass downloading of all deferred debuginfo so that gdb can search the debuginfo for matching source filenames. This can result in unnecessary downloads. To improve this, have gdb instead download each debuginfo's .debug_line (and .debug_line_str if using DWARF5) when executing these commands. Download full debuginfo only when its .debug_line contains a matching filename. Since the combined size of .debug_line and .debug_line_str is only about 1% the size of the corresponding debuginfo, significant time can be saved by checking these sections before choosing to download an entire debuginfo. This patch also redirects stdout and stderr of the debuginfod server used by testsuite/gdb.debuginfod tests to a server_log standard output file. While adding tests for this patch I ran into an issue where the test server would block when logging to stderr, presumably because the stderr buffer filled up and wasn't being read from. Redirecting the log to a file fixes this and also makes the server log more accessible when debugging test failures.
Diffstat (limited to 'gdb/completer.c')
-rw-r--r--gdb/completer.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gdb/completer.c b/gdb/completer.c
index 4735aa5..5d3837c 100644
--- a/gdb/completer.c
+++ b/gdb/completer.c
@@ -1753,6 +1753,10 @@ complete_line_internal_1 (completion_tracker &tracker,
{
/* We've recognized a full command. */
+ /* Disable pagination since responding to the pagination prompt
+ overwrites rl_line_buffer. */
+ scoped_restore pag_restore = make_scoped_restore (&pagination_enabled, false);
+
if (p == tmp_command + point)
{
/* There is no non-whitespace in the line beyond the
@@ -1852,7 +1856,8 @@ complete_line_internal_1 (completion_tracker &tracker,
}
/* Wrapper around complete_line_internal_1 to handle
- MAX_COMPLETIONS_REACHED_ERROR. */
+ MAX_COMPLETIONS_REACHED_ERROR and possible progress update
+ interactions. */
static void
complete_line_internal (completion_tracker &tracker,
@@ -1860,6 +1865,11 @@ complete_line_internal (completion_tracker &tracker,
const char *line_buffer, int point,
complete_line_internal_reason reason)
{
+ scoped_restore restore_prefix_state
+ = make_scoped_restore
+ (&cur_prefix_state,
+ ui_out::progress_update::prefix_state::NEWLINE_NEEDED);
+
try
{
complete_line_internal_1 (tracker, text, line_buffer, point, reason);
@@ -1869,6 +1879,12 @@ complete_line_internal (completion_tracker &tracker,
if (except.error != MAX_COMPLETIONS_REACHED_ERROR)
throw;
}
+
+ /* If progress update messages printed, then the text being completed
+ needs to be printed again. */
+ if (cur_prefix_state
+ == ui_out::progress_update::prefix_state::NEWLINE_PRINTED)
+ rl_forced_update_display ();
}
/* See completer.h. */