From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23707 invoked by alias); 13 Jun 2006 20:50:22 -0000 Received: (qmail 23698 invoked by uid 22791); 13 Jun 2006 20:50:21 -0000 X-Spam-Check-By: sourceware.org Received: from nevyn.them.org (HELO nevyn.them.org) (66.93.172.17) by sourceware.org (qpsmtpd/0.31.1) with ESMTP; Tue, 13 Jun 2006 20:50:17 +0000 Received: from drow by nevyn.them.org with local (Exim 4.54) id 1FqFq2-0005Y5-QK for gdb-patches@sourceware.org; Tue, 13 Jun 2006 16:50:14 -0400 Date: Tue, 13 Jun 2006 20:50:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sourceware.org Subject: RFC: Don't kill the program after "file" Message-ID: <20060613205014.GA20822@nevyn.them.org> Mail-Followup-To: gdb-patches@sourceware.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.11+cvs20060403 X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-06/txt/msg00202.txt.bz2 The "file" command currently prompts if a program is running: (gdb) file /bin/cat A program is being debugged already. Kill it? (y or n) I've encountered a couple problems with this: 1. If you say "no", it aborts the "file" command. So there is no way to deliberately change the file. 2. If you say yes, it doesn't just do the equivalent of "kill", but "kill" and "disconnect". For target extended-remote, this means you come unexpectedly disconnected from your target. This patch completely removes the prompt. Instead, we simply allow it. It's occasionally useful, even during native debugging (at least I know I've attached to a running program with the wrong file specified before). It's more useful during remote debugging, where I've seen users frequently confused that "target remote; file" doesn't work even though "file; target remote" does. I talked with Jim about this. He wasn't entirely happy with discarding the prompt for native debugging, where it traditionally makes sense; we didn't quite make it to an agreement on what ought to happen. He suggested adding a "process-oriented" flag to target vectors. For a process oriented target (i.e. one which can handle "run" and "kill" and so forth) it makes sense to offer to kill at this point; for board oriented targets it makes less sense. Another thing which just occured to me would be to make the file command succeed if you say "n" at the query. Any comments? I'm definitely not planning to commit this patch without more discussion. Tested on x86_64-pc-linux-gnu. -- Daniel Jacobowitz CodeSourcery 2006-06-13 Daniel Jacobowitz * corefile.c (reopen_exec_file): Only check for an open exec file. Use exec_file_attach. * exec.c (exec_open): Make static. (exec_file_command): Don't use target_preopen. * gdbcore.h (exec_open): Remove prototype. 2006-06-13 Daniel Jacobowitz * gdb.base/completion.exp: Remove support for kill prompt after "file". * gdb.stabs/weird.exp: Likewise. * lib/mi-support.exp (mi_gdb_file_cmd): Likewise. * lib/gdb.exp (gdb_file_cmd): Likewise. Kill the program explicitly. Index: corefile.c =================================================================== RCS file: /cvs/src/src/gdb/corefile.c,v retrieving revision 1.37 diff -u -p -r1.37 corefile.c --- corefile.c 10 Jan 2006 23:01:44 -0000 1.37 +++ corefile.c 13 Jun 2006 20:35:35 -0000 @@ -156,8 +156,8 @@ reopen_exec_file (void) struct stat st; long mtime; - /* Don't do anything if the current target isn't exec. */ - if (exec_bfd == NULL || strcmp (target_shortname, "exec") != 0) + /* Don't do anything if there isn't an exec. */ + if (exec_bfd == NULL) return; /* If the timestamp of the exec file has changed, reopen it. */ @@ -167,9 +167,7 @@ reopen_exec_file (void) res = stat (filename, &st); if (mtime && mtime != st.st_mtime) - { - exec_open (filename, 0); - } + exec_file_attach (filename, 0); #endif } Index: exec.c =================================================================== RCS file: /cvs/src/src/gdb/exec.c,v retrieving revision 1.61 diff -u -p -r1.61 exec.c --- exec.c 18 Apr 2006 19:20:06 -0000 1.61 +++ exec.c 13 Jun 2006 20:35:35 -0000 @@ -85,7 +85,7 @@ show_write_files (struct ui_file *file, struct vmap *vmap; -void +static void exec_open (char *args, int from_tty) { target_preopen (from_tty); @@ -287,8 +287,6 @@ exec_file_command (char *args, int from_ char **argv; char *filename; - target_preopen (from_tty); - if (args) { /* Scan through the args and pick up the first non option arg Index: gdbcore.h =================================================================== RCS file: /cvs/src/src/gdb/gdbcore.h,v retrieving revision 1.20 diff -u -p -r1.20 gdbcore.h --- gdbcore.h 17 Dec 2005 22:34:00 -0000 1.20 +++ gdbcore.h 13 Jun 2006 20:35:35 -0000 @@ -123,8 +123,6 @@ extern int write_files; extern void core_file_command (char *filename, int from_tty); -extern void exec_open (char *filename, int from_tty); - extern void exec_file_attach (char *filename, int from_tty); extern void exec_file_clear (int from_tty); Index: testsuite/gdb.base/completion.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/completion.exp,v retrieving revision 1.22 diff -u -p -r1.22 completion.exp --- testsuite/gdb.base/completion.exp 7 Mar 2006 15:23:32 -0000 1.22 +++ testsuite/gdb.base/completion.exp 13 Jun 2006 20:35:35 -0000 @@ -671,19 +671,10 @@ sleep 1 gdb_expect { -re "^file ./gdb.base/completion\\.exp $"\ { send_gdb "\n" - gdb_expect { - -re "\r\nA program is being debugged already\\. Kill it\\? \\(y or n\\) $" - { send_gdb "n\n" - gdb_expect { - -re "\r\nProgram not killed\\.\r\n$gdb_prompt $"\ - { pass "complete 'file ./gdb.base/complet'"} - -re ".*$gdb_prompt $" { fail "complete 'file ./gdb.base/complet'"} - timeout {fail "(timeout) complete 'file ./gdb.base/complet'"} - } - } - -re ".*$gdb_prompt $" { fail "complete 'file ./gdb.base/complet'"} - timeout {fail "(timeout) complete 'file ./gdb.base/complet'"} - } + # Ignore the exact error message. + gdb_test_multiple "" "complete 'file ./gdb.base/complet'" { + -re ".*$gdb_prompt $" { pass "complete 'file ./gdb.base/complet'" } + } } -re ".*$gdb_prompt $" { fail "complete 'file ./gdb.base/complet'" } timeout { fail "(timeout) complete 'file ./gdb.base/complet'" } Index: testsuite/gdb.stabs/weird.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.stabs/weird.exp,v retrieving revision 1.8 diff -u -p -r1.8 weird.exp --- testsuite/gdb.stabs/weird.exp 22 Apr 2004 17:55:46 -0000 1.8 +++ testsuite/gdb.stabs/weird.exp 13 Jun 2006 20:35:35 -0000 @@ -313,10 +313,6 @@ gdb_expect 60 { -re "^file (\[^ \]| +\008)*\r*\n" { exp_continue } - -re "A program is being debugged already. Kill it\\? \\(y or n\\)" { - send_gdb "y\n" - exp_continue - } -re "^Reading symbols from .*$binfile\\.\\.\\.done\.(|\r\nUsing host libthread_db library .*libthread_db.so.*\\.)\r\n$gdb_prompt $" { pass "weirdx.o read without error" } Index: testsuite/lib/gdb.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/lib/gdb.exp,v retrieving revision 1.66 diff -u -p -r1.66 gdb.exp --- testsuite/lib/gdb.exp 13 Jun 2006 13:20:25 -0000 1.66 +++ testsuite/lib/gdb.exp 13 Jun 2006 20:35:36 -0000 @@ -1008,6 +1008,20 @@ proc gdb_file_cmd { arg } { } } + # The file command used to kill the remote target. For the benefit + # of the testsuite, preserve this behavior. + send_gdb "kill\n" + gdb_expect 120 { + -re "Kill the program being debugged. .y or n. $" { + send_gdb "y\n" + verbose "\t\tKilling previous program being debugged" + exp_continue + } + -re "$gdb_prompt $" { + # OK. + } + } + send_gdb "file $arg\n" gdb_expect 120 { -re "Reading symbols from.*no debugging symbols found.*done.*$gdb_prompt $" { @@ -1020,11 +1034,6 @@ proc gdb_file_cmd { arg } { set gdb_file_cmd_debug_info "debug" return 0 } - -re "A program is being debugged already.*Kill it.*y or n. $" { - send_gdb "y\n" - verbose "\t\tKilling previous program being debugged" - exp_continue - } -re "Load new symbol table from \".*\".*y or n. $" { send_gdb "y\n" gdb_expect 120 { Index: testsuite/lib/mi-support.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/lib/mi-support.exp,v retrieving revision 1.32 diff -u -p -r1.32 mi-support.exp --- testsuite/lib/mi-support.exp 27 Sep 2005 22:39:04 -0000 1.32 +++ testsuite/lib/mi-support.exp 13 Jun 2006 20:35:36 -0000 @@ -411,11 +411,6 @@ proc mi_gdb_file_cmd { arg } { perror "$arg wasn't compiled with \"-g\"" return -1 } - -re "A program is being debugged already.*Kill it.*y or n. $" { - send_gdb "y\n" - verbose "\t\tKilling previous program being debugged" - exp_continue - } -re "Load new symbol table from \".*\".*y or n. $" { send_gdb "y\n" gdb_expect 120 {