From patchwork Thu Aug 13 13:23:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 8184 Received: (qmail 21063 invoked by alias); 13 Aug 2015 13:24:07 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 21039 invoked by uid 89); 13 Aug 2015 13:24:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 13 Aug 2015 13:24:03 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id A76792F1; Thu, 13 Aug 2015 13:24:02 +0000 (UTC) Received: from blade.nx (ovpn-116-40.ams2.redhat.com [10.36.116.40]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7DDO03R016444; Thu, 13 Aug 2015 09:24:01 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id D2D5E264522; Thu, 13 Aug 2015 14:23:59 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Cc: Andrew Burgess , Sandra Loosemore , Doug Evans , Pedro Alves , Jan Kratochvil , =?UTF-8?q?Andr=C3=A9=20P=C3=B6nitz?= , Paul_Koning@Dell.com, Joel Brobecker Subject: [PATCH v2] Warn when accessing binaries from remote targets Date: Thu, 13 Aug 2015 14:23:59 +0100 Message-Id: <1439472239-15866-1-git-send-email-gbenson@redhat.com> In-Reply-To: <20150811140440.GB24095@blade.nx> References: <20150811140440.GB24095@blade.nx> X-IsSubscribed: yes Hi all, This is an updated version of the patch I previously mailed to add a warning message when GDB initiates transfers from remote targets. This version adds a new function, target_fileio_open_warn_if_slow, as suggested by Andrew and Doug, and moves the message printing code into remote_hostio_open. Is this ok to commit? To HEAD? To the branch? To both? Cheers, Gary --- GDB provides no indicator of progress during file operations, and can appear to have locked up during slow remote transfers. This commit updates GDB to print a warning each time a file is accessed over RSP. An additional message detailing how to avoid remote transfers is printed for the first transfer only. gdb/ChangeLog: * target.h (struct target_ops) : New argument warn_if_slow. Update comment. All implementations updated. (target_fileio_open_warn_if_slow): New declaration. * target.c (target_fileio_open): Renamed as... (target_fileio_open_1): ...this. New argument warn_if_slow. Pass warn_if_slow to implementation. Update debug printing. (target_fileio_open): New function. (target_fileio_open_warn_if_slow): Likewise. * gdb_bfd.c (gdb_bfd_iovec_fileio_open): Use new function target_fileio_open_warn_if_slow. gdb/testsuite/ChangeLog: * gdb.trace/pending.exp: Cope with remote transfer warnings. --- gdb/ChangeLog | 13 ++++++++++++ gdb/gdb_bfd.c | 9 ++++--- gdb/inf-child.c | 3 +- gdb/linux-nat.c | 3 +- gdb/remote.c | 26 ++++++++++++++++++++--- gdb/target.c | 38 ++++++++++++++++++++++++++++------ gdb/target.h | 17 ++++++++++++-- gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/gdb.trace/pending.exp | 8 +++--- 9 files changed, 97 insertions(+), 24 deletions(-) diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c index 1781d80..264b611 100644 --- a/gdb/gdb_bfd.c +++ b/gdb/gdb_bfd.c @@ -222,10 +222,11 @@ gdb_bfd_iovec_fileio_open (struct bfd *abfd, void *inferior) gdb_assert (is_target_filename (filename)); - fd = target_fileio_open ((struct inferior *) inferior, - filename + strlen (TARGET_SYSROOT_PREFIX), - FILEIO_O_RDONLY, 0, - &target_errno); + fd = target_fileio_open_warn_if_slow ((struct inferior *) inferior, + filename + + strlen (TARGET_SYSROOT_PREFIX), + FILEIO_O_RDONLY, 0, + &target_errno); if (fd == -1) { errno = fileio_errno_to_host (target_errno); diff --git a/gdb/inf-child.c b/gdb/inf-child.c index 0326a93..ada570d 100644 --- a/gdb/inf-child.c +++ b/gdb/inf-child.c @@ -209,7 +209,8 @@ inf_child_pid_to_exec_file (struct target_ops *self, int pid) static int inf_child_fileio_open (struct target_ops *self, struct inferior *inf, const char *filename, - int flags, int mode, int *target_errno) + int flags, int mode, int warn_if_slow, + int *target_errno) { int nat_flags; mode_t nat_mode; diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index be7a915..f21b1c5 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4920,7 +4920,8 @@ linux_nat_fileio_pid_of (struct inferior *inf) static int linux_nat_fileio_open (struct target_ops *self, struct inferior *inf, const char *filename, - int flags, int mode, int *target_errno) + int flags, int mode, int warn_if_slow, + int *target_errno) { int nat_flags; mode_t nat_mode; diff --git a/gdb/remote.c b/gdb/remote.c index ca1f0df..d9a8bb7 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -10359,12 +10359,29 @@ remote_hostio_set_filesystem (struct inferior *inf, int *remote_errno) static int remote_hostio_open (struct target_ops *self, struct inferior *inf, const char *filename, - int flags, int mode, int *remote_errno) + int flags, int mode, int warn_if_slow, + int *remote_errno) { struct remote_state *rs = get_remote_state (); char *p = rs->buf; int left = get_remote_packet_size () - 1; + if (warn_if_slow) + { + static int warning_issued = 0; + + printf_unfiltered (_("Reading %s from remote target...\n"), + filename); + + if (!warning_issued) + { + warning (_("File transfers from remote targets can be slow." + " Use \"set sysroot\" with no arguments to access" + " files locally instead.")); + warning_issued = 1; + } + } + if (remote_hostio_set_filesystem (inf, remote_errno) != 0) return -1; @@ -10613,7 +10630,7 @@ remote_filesystem_is_local (struct target_ops *self) filename is irrelevant, we only care about whether the stub recognizes the packet or not. */ fd = remote_hostio_open (self, NULL, "just probing", - FILEIO_O_RDONLY, 0700, + FILEIO_O_RDONLY, 0700, 0, &remote_errno); if (fd >= 0) @@ -10735,7 +10752,7 @@ remote_file_put (const char *local_file, const char *remote_file, int from_tty) fd = remote_hostio_open (find_target_at (process_stratum), NULL, remote_file, (FILEIO_O_WRONLY | FILEIO_O_CREAT | FILEIO_O_TRUNC), - 0700, &remote_errno); + 0700, 0, &remote_errno); if (fd == -1) remote_hostio_error (remote_errno); @@ -10819,7 +10836,8 @@ remote_file_get (const char *remote_file, const char *local_file, int from_tty) error (_("command can only be used with remote target")); fd = remote_hostio_open (find_target_at (process_stratum), NULL, - remote_file, FILEIO_O_RDONLY, 0, &remote_errno); + remote_file, FILEIO_O_RDONLY, 0, 0, + &remote_errno); if (fd == -1) remote_hostio_error (remote_errno); diff --git a/gdb/target.c b/gdb/target.c index e41a338..a0a55d9 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2779,11 +2779,13 @@ release_fileio_fd (int fd, fileio_fh_t *fh) #define fileio_fd_to_fh(fd) \ VEC_index (fileio_fh_t, fileio_fhandles, (fd)) -/* See target.h. */ +/* Helper for target_fileio_open and + target_fileio_open_warn_if_slow. */ -int -target_fileio_open (struct inferior *inf, const char *filename, - int flags, int mode, int *target_errno) +static int +target_fileio_open_1 (struct inferior *inf, const char *filename, + int flags, int mode, int warn_if_slow, + int *target_errno) { struct target_ops *t; @@ -2792,7 +2794,7 @@ target_fileio_open (struct inferior *inf, const char *filename, if (t->to_fileio_open != NULL) { int fd = t->to_fileio_open (t, inf, filename, flags, mode, - target_errno); + warn_if_slow, target_errno); if (fd < 0) fd = -1; @@ -2801,11 +2803,12 @@ target_fileio_open (struct inferior *inf, const char *filename, if (targetdebug) fprintf_unfiltered (gdb_stdlog, - "target_fileio_open (%d,%s,0x%x,0%o)" + "target_fileio_open (%d,%s,0x%x,0%o,%d)" " = %d (%d)\n", inf == NULL ? 0 : inf->num, filename, flags, mode, - fd, fd != -1 ? 0 : *target_errno); + warn_if_slow, fd, + fd != -1 ? 0 : *target_errno); return fd; } } @@ -2817,6 +2820,27 @@ target_fileio_open (struct inferior *inf, const char *filename, /* See target.h. */ int +target_fileio_open (struct inferior *inf, const char *filename, + int flags, int mode, int *target_errno) +{ + return target_fileio_open_1 (inf, filename, flags, mode, 0, + target_errno); +} + +/* See target.h. */ + +int +target_fileio_open_warn_if_slow (struct inferior *inf, + const char *filename, + int flags, int mode, int *target_errno) +{ + return target_fileio_open_1 (inf, filename, flags, mode, 1, + target_errno); +} + +/* See target.h. */ + +int target_fileio_pwrite (int fd, const gdb_byte *write_buf, int len, ULONGEST offset, int *target_errno) { diff --git a/gdb/target.h b/gdb/target.h index e283c86..1fdaf00 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -873,11 +873,14 @@ struct target_ops /* Open FILENAME on the target, in the filesystem as seen by INF, using FLAGS and MODE. If INF is NULL, use the filesystem seen by the debugger (GDB or, for remote targets, the remote stub). - Return a target file descriptor, or -1 if an error occurs (and - set *TARGET_ERRNO). */ + If WARN_IF_SLOW is nonzero, print a warning message if the file + is being accessed over a link that may be slow. Return a + target file descriptor, or -1 if an error occurs (and set + *TARGET_ERRNO). */ int (*to_fileio_open) (struct target_ops *, struct inferior *inf, const char *filename, - int flags, int mode, int *target_errno); + int flags, int mode, int warn_if_slow, + int *target_errno); /* Write up to LEN bytes from WRITE_BUF to FD on the target. Return the number of bytes written, or -1 if an error occurs @@ -2007,6 +2010,14 @@ extern int target_fileio_open (struct inferior *inf, const char *filename, int flags, int mode, int *target_errno); +/* Like target_fileio_open, but print a warning message if the + file is being accessed over a link that may be slow. */ +extern int target_fileio_open_warn_if_slow (struct inferior *inf, + const char *filename, + int flags, + int mode, + int *target_errno); + /* Write up to LEN bytes from WRITE_BUF to FD on the target. Return the number of bytes written, or -1 if an error occurs (and set *TARGET_ERRNO). */ diff --git a/gdb/testsuite/gdb.trace/pending.exp b/gdb/testsuite/gdb.trace/pending.exp index 0399807..9938c5a 100644 --- a/gdb/testsuite/gdb.trace/pending.exp +++ b/gdb/testsuite/gdb.trace/pending.exp @@ -221,7 +221,7 @@ proc pending_tracepoint_resolved_during_trace { trace_type } \ fail $test } } - -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { pass $test } } @@ -294,7 +294,7 @@ proc pending_tracepoint_installed_during_trace { trace_type } \ fail $test } } - -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { pass $test } } @@ -391,7 +391,7 @@ proc pending_tracepoint_disconnect_after_resolved { trace_type } \ gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ "continue to marker 1" - gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + gdb_test "continue" "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\nBreakpoint.*marker.*at.*pending.c.*" \ "continue to marker 2" # There should be no pending tracepoint, so no warning should be emitted. @@ -473,7 +473,7 @@ proc pending_tracepoint_with_action_resolved { trace_type } \ fail $test } } - -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + -re "Continuing.\r\n(Reading .* from remote target...\r\n)?\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { pass "continue to marker 2" }