From: Gary Benson <gbenson@redhat.com>
To: gdb-patches@sourceware.org
Cc: Philippe Waroquiers <philippe.waroquiers@skynet.be>
Subject: [PATCH] Make only user-specified executable filenames sticky
Date: Wed, 06 May 2015 10:26:00 -0000 [thread overview]
Message-ID: <1430907977-30605-1-git-send-email-gbenson@redhat.com> (raw)
In-Reply-To: <20150505151448.GA1417@blade.nx>
Hi all,
In GDB some executable files are supplied by the user (e.g. using a
"file" command) and some are determined by GDB (e.g. while processing
an "attach" command). GDB will not attempt to determine a filename if
one has been set. This causes problems if you attach to one process
and then attach to another: GDB will not attempt to discover the main
executable on the second attach. If the two processes have different
main executable files then the symbols will now be wrong.
This commit updates GDB to keep track of which executable filenames
were supplied by the user. When GDB might attempt to determine an
executable filename and one is already set, filenames determined by
GDB may be overridden but user-supplied filenames will not.
Built and regtested on RHEL6.6 x86_64.
Is this ok to commit?
Cheers,
Gary
gdb/ChangeLog:
* progspace.h (struct program_space)
<pspace_user_supplied_exec_file_p>: New field.
* exec.h (user_supplied_exec_file_p): New macro.
* exec.c (exec_close): Clear user_supplied_exec_file_p.
(exec_file_locate_attach): Remove get_exec_file check.
(exec_file_command): Set user_supplied_exec_file_p.
* inferior.c (add_inferior_command): Likewise.
* main.c (captured_main): Likewise.
* infcmd.c (attach_command_post_wait): Always try and
locate main executable if !user_supplied_exec_file_p.
* remote.c (remote_add_inferior): Likewise.
---
gdb/ChangeLog | 14 ++++++++++++++
gdb/exec.c | 7 ++-----
gdb/exec.h | 2 ++
gdb/infcmd.c | 12 +++++++-----
gdb/inferior.c | 1 +
gdb/main.c | 16 +++++++++++-----
gdb/progspace.h | 7 +++++++
gdb/remote.c | 7 ++++---
8 files changed, 48 insertions(+), 18 deletions(-)
diff --git a/gdb/exec.c b/gdb/exec.c
index 8a4ab6f..278df83 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -102,6 +102,7 @@ exec_close (void)
xfree (exec_filename);
exec_filename = NULL;
+ user_supplied_exec_file_p = 0;
}
}
@@ -142,11 +143,6 @@ exec_file_locate_attach (int pid, int from_tty)
{
char *exec_file, *full_exec_path = NULL;
- /* Do nothing if we already have an executable filename. */
- exec_file = (char *) get_exec_file (0);
- if (exec_file != NULL)
- return;
-
/* Try to determine a filename from the process itself. */
exec_file = target_pid_to_exec_file (pid);
if (exec_file == NULL)
@@ -376,6 +372,7 @@ exec_file_command (char *args, int from_tty)
filename = tilde_expand (*argv);
make_cleanup (xfree, filename);
exec_file_attach (filename, from_tty);
+ user_supplied_exec_file_p = 1;
do_cleanups (cleanups);
}
diff --git a/gdb/exec.h b/gdb/exec.h
index c7f3b56..3794aba 100644
--- a/gdb/exec.h
+++ b/gdb/exec.h
@@ -32,6 +32,8 @@ struct objfile;
#define exec_bfd current_program_space->ebfd
#define exec_bfd_mtime current_program_space->ebfd_mtime
#define exec_filename current_program_space->pspace_exec_filename
+#define user_supplied_exec_file_p \
+ current_program_space->pspace_user_supplied_exec_file_p
/* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
Returns 0 if OK, 1 on error. */
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 7e2484b..491cbb6 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2467,15 +2467,17 @@ attach_command_post_wait (char *args, int from_tty, int async_exec)
inferior = current_inferior ();
inferior->control.stop_soon = NO_STOP_QUIETLY;
- /* If no exec file is yet known, try to determine it from the
- process itself. */
- if (get_exec_file (0) == NULL)
- exec_file_locate_attach (ptid_get_pid (inferior_ptid), from_tty);
- else
+ if (user_supplied_exec_file_p)
{
reopen_exec_file ();
reread_symbols ();
}
+ else
+ {
+ /* Attempt to open the file that was executed to create this
+ inferior. */
+ exec_file_locate_attach (ptid_get_pid (inferior_ptid), from_tty);
+ }
/* Take any necessary post-attaching actions for this platform. */
target_post_attach (ptid_get_pid (inferior_ptid));
diff --git a/gdb/inferior.c b/gdb/inferior.c
index ba320b5..87b2133 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -889,6 +889,7 @@ add_inferior_command (char *args, int from_tty)
exec_file_attach (exec, from_tty);
symbol_file_add_main (exec, from_tty);
+ user_supplied_exec_file_p = 1;
}
}
diff --git a/gdb/main.c b/gdb/main.c
index 477fd68..9d8a196 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -1051,14 +1051,20 @@ captured_main (void *data)
catch_command_errors returns non-zero on success! */
if (catch_command_errors_const (exec_file_attach, execarg,
!batch_flag))
- catch_command_errors_const (symbol_file_add_main, symarg,
- !batch_flag);
+ {
+ user_supplied_exec_file_p = 1;
+
+ catch_command_errors_const (symbol_file_add_main, symarg,
+ !batch_flag);
+ }
}
else
{
- if (execarg != NULL)
- catch_command_errors_const (exec_file_attach, execarg,
- !batch_flag);
+ if (execarg != NULL
+ && catch_command_errors_const (exec_file_attach, execarg,
+ !batch_flag))
+ user_supplied_exec_file_p = 1;
+
if (symarg != NULL)
catch_command_errors_const (symbol_file_add_main, symarg,
!batch_flag);
diff --git a/gdb/progspace.h b/gdb/progspace.h
index f960093..f8c39b6 100644
--- a/gdb/progspace.h
+++ b/gdb/progspace.h
@@ -154,6 +154,13 @@ struct program_space
It needs to be freed by xfree. It is not NULL iff EBFD is not NULL. */
char *pspace_exec_filename;
+ /* Nonzero if pspace_exec_filename was supplied by the user,
+ either at startup (on the command-line) or via a "file"
+ an "add-inferior -exec" command. Zero if
+ pspace_exec_filename is unset or was discovered by GDB
+ somehow. */
+ int pspace_user_supplied_exec_file_p;
+
/* The address space attached to this program space. More than one
program space may be bound to the same address space. In the
traditional unix-like debugging scenario, this will usually
diff --git a/gdb/remote.c b/gdb/remote.c
index 099ddbb..b2f1bba 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1556,9 +1556,10 @@ remote_add_inferior (int fake_pid_p, int pid, int attached,
inf->attach_flag = attached;
inf->fake_pid_p = fake_pid_p;
- /* If no main executable is currently open then attempt to
- open the file that was executed to create this inferior. */
- if (try_open_exec && !fake_pid_p && get_exec_file (0) == NULL)
+ /* If the user did not explicitly specify an executable file
+ then attempt to open the file that was executed to create
+ this inferior. */
+ if (try_open_exec && !fake_pid_p && !user_supplied_exec_file_p)
exec_file_locate_attach (pid, 1);
return inf;
--
1.7.1
next prev parent reply other threads:[~2015-05-06 10:26 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-02 9:48 qXfer:exec-file:read and non multiprocess target Philippe Waroquiers
2015-05-05 11:02 ` Gary Benson
2015-05-05 20:45 ` Philippe Waroquiers
2015-05-06 10:31 ` Gary Benson
2015-05-06 17:10 ` [PATCH] Locate executables on remote stubs without multiprocess extensions Gary Benson
2015-05-06 17:15 ` Eli Zaretskii
2015-05-06 17:16 ` Gary Benson
2015-05-11 14:37 ` Pedro Alves
2015-05-12 11:03 ` Gary Benson
2015-05-05 15:14 ` qXfer:exec-file:read and non multiprocess target Gary Benson
2015-05-06 10:26 ` Gary Benson [this message]
2015-05-06 12:19 ` [PATCH] Make only user-specified executable filenames sticky Pedro Alves
2015-05-06 14:21 ` Pedro Alves
2015-05-06 15:20 ` Gary Benson
2015-05-11 13:57 ` Pedro Alves
2015-05-06 14:46 ` Philippe Waroquiers
2015-05-06 15:41 ` Gary Benson
2015-05-11 13:58 ` Pedro Alves
2015-05-11 20:25 ` Doug Evans
2015-05-11 17:14 ` Don Breazeal
2015-06-05 9:37 ` Gary Benson
2015-06-05 14:54 ` Don Breazeal
2015-07-03 11:14 ` Gary Benson
2015-07-06 12:53 ` Joel Brobecker
2015-07-17 21:48 ` Joel Brobecker
2015-05-11 20:23 ` Doug Evans
2015-05-12 10:36 ` Pedro Alves
2015-05-12 11:13 ` Gary Benson
2015-05-12 11:16 ` Pedro Alves
2015-05-12 13:48 ` Gary Benson
2015-05-12 14:08 ` Pedro Alves
2015-05-12 15:49 ` Doug Evans
2015-05-13 7:55 ` Gary Benson
2015-05-13 9:12 ` Pedro Alves
2015-06-03 17:23 ` Joel Brobecker
2015-06-05 11:22 ` [PATCH v2] Make only user-specified executable and symbol " Gary Benson
2015-06-07 11:40 ` Philippe Waroquiers
2015-06-08 9:01 ` [PATCH v3] " Gary Benson
2015-06-08 19:42 ` Philippe Waroquiers
2015-07-03 11:01 ` Gary Benson
2015-07-03 15:44 ` Pedro Alves
2015-07-06 13:01 ` Pedro Alves
2015-06-07 12:03 ` [PATCH v2] " Philippe Waroquiers
2015-06-07 12:13 ` Philippe Waroquiers
2015-05-13 8:06 ` [PATCH] Make only user-specified executable " Pedro Alves
2015-05-12 16:03 ` Doug Evans
2015-05-13 8:39 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1430907977-30605-1-git-send-email-gbenson@redhat.com \
--to=gbenson@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=philippe.waroquiers@skynet.be \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox