mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
New commands enable probe' and
disable probe'.
This patch adds the above-mentioned commands to the generic probe abstraction implemented in probe.[ch]. The effects associated to enabling or disabling a probe depend on the type of probe being handled, and is triggered by invoking two back-end hooks in `probe_ops'. In case some particular probe type does not support the notion of enabling and/or disabling, the corresponding fields on `probe_ops' can be initialized to NULL. This is the case of SystemTap probes. gdb/ChangeLog: 2015-02-17 Jose E. Marchesi <jose.marchesi@oracle.com> * stap-probe.c (stap_probe_ops): Add NULLs in the static stap_probe_ops for `enable_probe' and `disable_probe'. * probe.c (enable_probes_command): New function. (disable_probes_command): Likewise. (_initialize_probe): Define the cli commands `enable probe' and `disable probe'. (parse_probe_linespec): New function. (info_probes_for_ops): Use parse_probe_linespec. * probe.h (probe_ops): New hooks `enable_probe' and `disable_probe'. gdb/doc/ChangeLog: 2015-02-17 Jose E. Marchesi <jose.marchesi@oracle.com> * gdb.texinfo (Static Probe Points): Cover the `enable probe' and `disable probe' commands.
This commit is contained in:
parent
03e98035a2
commit
9aca2ff83e
@ -1,3 +1,16 @@
|
||||
2015-02-17 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||
|
||||
* stap-probe.c (stap_probe_ops): Add NULLs in the static
|
||||
stap_probe_ops for `enable_probe' and `disable_probe'.
|
||||
* probe.c (enable_probes_command): New function.
|
||||
(disable_probes_command): Likewise.
|
||||
(_initialize_probe): Define the cli commands `enable probe' and
|
||||
`disable probe'.
|
||||
(parse_probe_linespec): New function.
|
||||
(info_probes_for_ops): Use parse_probe_linespec.
|
||||
* probe.h (probe_ops): New hooks `enable_probe' and
|
||||
`disable_probe'.
|
||||
|
||||
2015-02-17 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||
|
||||
* probe.c (compute_probe_arg): Moved from stap-probe.c
|
||||
|
@ -1,3 +1,8 @@
|
||||
2015-02-17 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||
|
||||
* gdb.texinfo (Static Probe Points): Cover the `enable probe' and
|
||||
`disable probe' commands.
|
||||
|
||||
2015-02-12 David Taylor <dtaylor@emc.com>
|
||||
|
||||
* gdb.texinfo (Tracepoint Packets): Document the builtin and name
|
||||
|
@ -5011,6 +5011,35 @@ given, all object files are considered.
|
||||
List the available static probes, from all types.
|
||||
@end table
|
||||
|
||||
@cindex enabling and disabling probes
|
||||
Some probe points can be enabled and/or disabled. The effect of
|
||||
enabling or disabling a probe depends on the type of probe being
|
||||
handled. @code{SystemTap} probes cannot be disabled.
|
||||
|
||||
You can enable (or disable) one or more probes using the following
|
||||
commands, with optional arguments:
|
||||
|
||||
@table @code
|
||||
@kindex enable probes
|
||||
@item enable probes @r{[}@var{provider} @r{[}@var{name} @r{[}@var{objfile}@r{]}@r{]}@r{]}
|
||||
If given, @var{provider} is a regular expression used to match against
|
||||
provider names when selecting which probes to enable. If omitted,
|
||||
all probes from all providers are enabled.
|
||||
|
||||
If given, @var{name} is a regular expression to match against probe
|
||||
names when selecting which probes to enable. If omitted, probe names
|
||||
are not considered when deciding whether to enable them.
|
||||
|
||||
If given, @var{objfile} is a regular expression used to select which
|
||||
object files (executable or shared libraries) to examine. If not
|
||||
given, all object files are considered.
|
||||
|
||||
@kindex disable probes
|
||||
@item disable probes @r{[}@var{provider} @r{[}@var{name} @r{[}@var{objfile}@r{]}@r{]}@r{]}
|
||||
See the @code{enable probes} command above for a description of the
|
||||
optional arguments accepted by this command.
|
||||
@end table
|
||||
|
||||
@vindex $_probe_arg@r{, convenience variable}
|
||||
A probe may specify up to twelve arguments. These are available at the
|
||||
point at which the probe is defined---that is, when the current PC is
|
||||
|
153
gdb/probe.c
153
gdb/probe.c
@ -527,6 +527,24 @@ exists_probe_with_pops (VEC (bound_probe_s) *probes,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Helper function that parses a probe linespec of the form [PROVIDER
|
||||
[PROBE [OBJNAME]]] from the provided string STR. */
|
||||
|
||||
static void
|
||||
parse_probe_linespec (const char *str, char **provider,
|
||||
char **probe_name, char **objname)
|
||||
{
|
||||
*probe_name = *objname = NULL;
|
||||
|
||||
*provider = extract_arg_const (&str);
|
||||
if (*provider != NULL)
|
||||
{
|
||||
*probe_name = extract_arg_const (&str);
|
||||
if (*probe_name != NULL)
|
||||
*objname = extract_arg_const (&str);
|
||||
}
|
||||
}
|
||||
|
||||
/* See comment in probe.h. */
|
||||
|
||||
void
|
||||
@ -546,22 +564,10 @@ info_probes_for_ops (const char *arg, int from_tty,
|
||||
struct bound_probe *probe;
|
||||
struct gdbarch *gdbarch = get_current_arch ();
|
||||
|
||||
/* Do we have a `provider:probe:objfile' style of linespec? */
|
||||
provider = extract_arg_const (&arg);
|
||||
if (provider)
|
||||
{
|
||||
make_cleanup (xfree, provider);
|
||||
|
||||
probe_name = extract_arg_const (&arg);
|
||||
if (probe_name)
|
||||
{
|
||||
make_cleanup (xfree, probe_name);
|
||||
|
||||
objname = extract_arg_const (&arg);
|
||||
if (objname)
|
||||
make_cleanup (xfree, objname);
|
||||
}
|
||||
}
|
||||
parse_probe_linespec (arg, &provider, &probe_name, &objname);
|
||||
make_cleanup (xfree, provider);
|
||||
make_cleanup (xfree, probe_name);
|
||||
make_cleanup (xfree, objname);
|
||||
|
||||
probes = collect_probes (objname, provider, probe_name, pops);
|
||||
make_cleanup (VEC_cleanup (probe_p), &probes);
|
||||
@ -689,6 +695,98 @@ info_probes_command (char *arg, int from_tty)
|
||||
info_probes_for_ops (arg, from_tty, NULL);
|
||||
}
|
||||
|
||||
/* Implementation of the `enable probes' command. */
|
||||
|
||||
static void
|
||||
enable_probes_command (char *arg, int from_tty)
|
||||
{
|
||||
char *provider, *probe_name = NULL, *objname = NULL;
|
||||
struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
|
||||
VEC (bound_probe_s) *probes;
|
||||
struct bound_probe *probe;
|
||||
int i;
|
||||
|
||||
parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
|
||||
make_cleanup (xfree, provider);
|
||||
make_cleanup (xfree, probe_name);
|
||||
make_cleanup (xfree, objname);
|
||||
|
||||
probes = collect_probes (objname, provider, probe_name, NULL);
|
||||
if (VEC_empty (bound_probe_s, probes))
|
||||
{
|
||||
ui_out_message (current_uiout, 0, _("No probes matched.\n"));
|
||||
do_cleanups (cleanup);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enable the selected probes, provided their backends support the
|
||||
notion of enabling a probe. */
|
||||
for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
|
||||
{
|
||||
const struct probe_ops *pops = probe->probe->pops;
|
||||
|
||||
if (pops->enable_probe != NULL)
|
||||
{
|
||||
pops->enable_probe (probe->probe);
|
||||
ui_out_message (current_uiout, 0,
|
||||
_("Probe %s:%s enabled.\n"),
|
||||
probe->probe->provider, probe->probe->name);
|
||||
}
|
||||
else
|
||||
ui_out_message (current_uiout, 0,
|
||||
_("Probe %s:%s cannot be enabled.\n"),
|
||||
probe->probe->provider, probe->probe->name);
|
||||
}
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
/* Implementation of the `disable probes' command. */
|
||||
|
||||
static void
|
||||
disable_probes_command (char *arg, int from_tty)
|
||||
{
|
||||
char *provider, *probe_name = NULL, *objname = NULL;
|
||||
struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
|
||||
VEC (bound_probe_s) *probes;
|
||||
struct bound_probe *probe;
|
||||
int i;
|
||||
|
||||
parse_probe_linespec ((const char *) arg, &provider, &probe_name, &objname);
|
||||
make_cleanup (xfree, provider);
|
||||
make_cleanup (xfree, probe_name);
|
||||
make_cleanup (xfree, objname);
|
||||
|
||||
probes = collect_probes (objname, provider, probe_name, NULL /* pops */);
|
||||
if (VEC_empty (bound_probe_s, probes))
|
||||
{
|
||||
ui_out_message (current_uiout, 0, _("No probes matched.\n"));
|
||||
do_cleanups (cleanup);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Disable the selected probes, provided their backends support the
|
||||
notion of enabling a probe. */
|
||||
for (i = 0; VEC_iterate (bound_probe_s, probes, i, probe); ++i)
|
||||
{
|
||||
const struct probe_ops *pops = probe->probe->pops;
|
||||
|
||||
if (pops->disable_probe != NULL)
|
||||
{
|
||||
pops->disable_probe (probe->probe);
|
||||
ui_out_message (current_uiout, 0,
|
||||
_("Probe %s:%s disabled.\n"),
|
||||
probe->probe->provider, probe->probe->name);
|
||||
}
|
||||
else
|
||||
ui_out_message (current_uiout, 0,
|
||||
_("Probe %s:%s cannot be disabled.\n"),
|
||||
probe->probe->provider, probe->probe->name);
|
||||
}
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
|
||||
/* See comments in probe.h. */
|
||||
|
||||
CORE_ADDR
|
||||
@ -950,4 +1048,27 @@ _initialize_probe (void)
|
||||
_("\
|
||||
Show information about all type of probes."),
|
||||
info_probes_cmdlist_get ());
|
||||
|
||||
add_cmd ("probes", class_breakpoint, enable_probes_command, _("\
|
||||
Enable probes.\n\
|
||||
Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
|
||||
Each argument is a regular expression, used to select probes.\n\
|
||||
PROVIDER matches probe provider names.\n\
|
||||
NAME matches the probe names.\n\
|
||||
OBJECT matches the executable or shared library name.\n\
|
||||
If you do not specify any argument then the command will enable\n\
|
||||
all defined probes."),
|
||||
&enablelist);
|
||||
|
||||
add_cmd ("probes", class_breakpoint, disable_probes_command, _("\
|
||||
Disable probes.\n\
|
||||
Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
|
||||
Each argument is a regular expression, used to select probes.\n\
|
||||
PROVIDER matches probe provider names.\n\
|
||||
NAME matches the probe names.\n\
|
||||
OBJECT matches the executable or shared library name.\n\
|
||||
If you do not specify any argument then the command will disable\n\
|
||||
all defined probes."),
|
||||
&disablelist);
|
||||
|
||||
}
|
||||
|
12
gdb/probe.h
12
gdb/probe.h
@ -138,6 +138,18 @@ struct probe_ops
|
||||
|
||||
void (*gen_info_probes_table_values) (struct probe *probe,
|
||||
VEC (const_char_ptr) **values);
|
||||
|
||||
/* Enable a probe. The semantics of "enabling" a probe depend on
|
||||
the specific backend and the field can be NULL in case enabling
|
||||
probes is not supported. */
|
||||
|
||||
void (*enable_probe) (struct probe *probe);
|
||||
|
||||
/* Disable a probe. The semantics of "disabling" a probe depend
|
||||
on the specific backend and the field can be NULL in case
|
||||
disabling probes is not supported. */
|
||||
|
||||
void (*disable_probe) (struct probe *probe);
|
||||
};
|
||||
|
||||
/* Definition of a vector of probe_ops. */
|
||||
|
@ -1684,6 +1684,8 @@ const struct probe_ops stap_probe_ops =
|
||||
stap_type_name,
|
||||
stap_gen_info_probes_table_header,
|
||||
stap_gen_info_probes_table_values,
|
||||
NULL, /* enable_probe */
|
||||
NULL /* disable_probe */
|
||||
};
|
||||
|
||||
/* Implementation of the `info probes stap' command. */
|
||||
|
Loading…
Reference in New Issue
Block a user