From: Vladimir Prus <vladimir@codesourcery.com>
To: Pedro Alves <pedro@codesourcery.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA] Implement 'detach pid'.
Date: Fri, 14 Nov 2008 01:55:00 -0000 [thread overview]
Message-ID: <200811140058.49275.vladimir@codesourcery.com> (raw)
In-Reply-To: <200811122319.57637.pedro@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 996 bytes --]
On Thursday 13 November 2008 02:19:57 Pedro Alves wrote:
> On Wednesday 12 November 2008 20:39:02, Vladimir Prus wrote:
> > This patch makes CLI 'detach' and MI '-target-detach' accept the PID
> > of the process to detach from.
>
> I see several issues with this patch:
>
> - The target is not the right layer to do this. Before you reach here,
> you've already done things to the current inferior. E.g.,
> target.c:target_detach will call remove_breakpoints before reaching
> remote_detach_1. This means that, if you have e.g., selected inferior 1,
> and do detach 3, you'll remove breakpoints from inferior 1, and detach
> process 3. Breakpoints are an example. Other example is that before you
> reach the process stratum, you can pass by the thread_stratum, which again
> would do anything to the wrong detachee, since it's usually the
> process_statum that does the final real detach. That's bad.
How about the attached -- where mostly everything is done on MI side?
- Volodya
[-- Attachment #2: detach.diff --]
[-- Type: text/x-patch, Size: 4512 bytes --]
commit da4c2b7d1163dfd36c492f9f793c04f9bdb36d2b
Author: vladimir <vladimir@e7755896-6108-0410-9592-8049d3e74e28>
Date: Thu Jul 31 13:23:59 2008 +0000
Implement '-target-detach pid'.
* gdbthread.h (thread_callback_func): Clarify comment.
* infcmd.c (detach_command): Make nonstatic.
* inferior.h (detach_command): Declare.
* mi/mi-cmds.c (mi_cmds): Don't route -target-detach via CLI.
* mi/mi-cmds.h (mi_cmd_target_detach): Declare.
* /mi/mi-main.c (find_thread_of_process, mi_cmd_target_detach): New.
diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h
index cac20f7..1a65aa8 100644
--- a/gdb/gdbthread.h
+++ b/gdb/gdbthread.h
@@ -229,7 +229,9 @@ struct thread_info *find_thread_id (int num);
void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid);
/* Iterator function to call a user-provided callback function
- once for each known thread. */
+ once for each known thread. Returns 0 to continue iteration,
+ and 1 to stop -- which causes iterate_over_threads to return
+ the current thread_info. */
typedef int (*thread_callback_func) (struct thread_info *, void *);
extern struct thread_info *iterate_over_threads (thread_callback_func, void *);
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index b3af31f..810b3b7 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -86,8 +86,6 @@ static void unset_command (char *, int);
static void float_info (char *, int);
-static void detach_command (char *, int);
-
static void disconnect_command (char *, int);
static void unset_environment_command (char *, int);
@@ -2344,7 +2342,7 @@ attach_command (char *args, int from_tty)
* started via the normal ptrace (PTRACE_TRACEME).
*/
-static void
+void
detach_command (char *args, int from_tty)
{
dont_repeat (); /* Not for the faint of heart. */
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 1be6cc5..f004d44 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -269,6 +269,8 @@ extern void interrupt_target_command (char *args, int from_tty);
extern void interrupt_target_1 (int all_threads);
+extern void detach_command (char *, int);
+
/* Address at which inferior stopped. */
extern CORE_ADDR stop_pc;
diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c
index d38de35..51c720e 100644
--- a/gdb/mi/mi-cmds.c
+++ b/gdb/mi/mi-cmds.c
@@ -121,7 +121,7 @@ struct mi_cmd mi_cmds[] =
{ "symbol-type", { NULL, 0 }, NULL },
{ "target-attach", { "attach", 1 }, NULL },
{ "target-compare-sections", { NULL, 0 }, NULL },
- { "target-detach", { "detach", 0 }, 0 },
+ { "target-detach", { NULL, 0 }, mi_cmd_target_detach },
{ "target-disconnect", { "disconnect", 0 }, 0 },
{ "target-download", { "load", 1 }, NULL},
{ "target-exec-status", { NULL, 0 }, NULL },
diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h
index a9bb1e0..a399b9e 100644
--- a/gdb/mi/mi-cmds.h
+++ b/gdb/mi/mi-cmds.h
@@ -75,6 +75,7 @@ extern mi_cmd_argv_ftype mi_cmd_stack_list_frames;
extern mi_cmd_argv_ftype mi_cmd_stack_list_locals;
extern mi_cmd_argv_ftype mi_cmd_stack_select_frame;
extern mi_cmd_argv_ftype mi_cmd_symbol_list_lines;
+extern mi_cmd_argv_ftype mi_cmd_target_detach;
extern mi_cmd_argv_ftype mi_cmd_target_file_get;
extern mi_cmd_argv_ftype mi_cmd_target_file_put;
extern mi_cmd_argv_ftype mi_cmd_target_file_delete;
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 43ec0b4..36c0223 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -199,6 +199,42 @@ mi_cmd_exec_interrupt (char *command, char **argv, int argc)
error ("Usage: -exec-interrupt [--all]");
}
+static int
+find_thread_of_process (struct thread_info *ti, void *p)
+{
+ int pid = *(int *)p;
+ if (PIDGET (ti->ptid) == pid && !is_exited (ti->ptid))
+ return 1;
+
+ return 0;
+}
+
+void
+mi_cmd_target_detach (char *command, char **argv, int argc)
+{
+ if (argc != 0 && argc != 1)
+ error ("Usage: -target-detach [thread-group]");
+
+ if (argc == 1)
+ {
+ struct thread_info *tp;
+ char *end = argv[0];
+ int pid = strtol (argv[0], &end, 10);
+ if (*end != '\0')
+ error (_("Cannot parse thread group id '%s'"), argv[0]);
+
+ /* Pick any thread in the desired process. Current
+ target_detach deteches from the parent of inferior_ptid. */
+ tp = iterate_over_threads (find_thread_of_process, &pid);
+ if (!tp)
+ error (_("Thread group is empty"));
+
+ switch_to_thread (tp->ptid);
+ }
+
+ detach_command (NULL, 0);
+}
+
void
mi_cmd_thread_select (char *command, char **argv, int argc)
{
next prev parent reply other threads:[~2008-11-13 21:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-12 21:17 Vladimir Prus
2008-11-13 12:52 ` Pedro Alves
2008-11-14 1:55 ` Vladimir Prus [this message]
2008-11-14 5:12 ` Pedro Alves
2008-11-14 12:57 ` Vladimir Prus
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=200811140058.49275.vladimir@codesourcery.com \
--to=vladimir@codesourcery.com \
--cc=gdb-patches@sourceware.org \
--cc=pedro@codesourcery.com \
/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