1 /* Generic static probe support for GDB.
3 Copyright (C) 2012-2021 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "cli/cli-cmds.h"
24 #include "cli/cli-utils.h"
27 #include "progspace.h"
28 #include "filenames.h"
30 #include "gdb_regex.h"
32 #include "arch-utils.h"
39 #include "gdbsupport/gdb_optional.h"
41 /* Class that implements the static probe methods for "any" probe. */
43 class any_static_probe_ops
: public static_probe_ops
47 bool is_linespec (const char **linespecp
) const override
;
50 void get_probes (std::vector
<std::unique_ptr
<probe
>> *probesp
,
51 struct objfile
*objfile
) const override
;
54 const char *type_name () const override
;
57 std::vector
<struct info_probe_column
> gen_info_probes_table_header
61 /* Static operations associated with a generic probe. */
63 const any_static_probe_ops any_static_probe_ops
{};
65 /* A helper for parse_probes that decodes a probe specification in
66 SEARCH_PSPACE. It appends matching SALs to RESULT. */
69 parse_probes_in_pspace (const static_probe_ops
*spops
,
70 struct program_space
*search_pspace
,
71 const char *objfile_namestr
,
74 std::vector
<symtab_and_line
> *result
)
76 for (objfile
*objfile
: search_pspace
->objfiles ())
78 if (!objfile
->sf
|| !objfile
->sf
->sym_probe_fns
)
82 && FILENAME_CMP (objfile_name (objfile
), objfile_namestr
) != 0
83 && FILENAME_CMP (lbasename (objfile_name (objfile
)),
84 objfile_namestr
) != 0)
87 const std::vector
<std::unique_ptr
<probe
>> &probes
88 = objfile
->sf
->sym_probe_fns
->sym_get_probes (objfile
);
90 for (auto &p
: probes
)
92 if (spops
!= &any_static_probe_ops
&& p
->get_static_ops () != spops
)
95 if (provider
!= NULL
&& p
->get_provider () != provider
)
98 if (p
->get_name () != name
)
102 sal
.pc
= p
->get_relocated_address (objfile
);
104 sal
.section
= find_pc_overlay (sal
.pc
);
105 sal
.pspace
= search_pspace
;
107 sal
.objfile
= objfile
;
109 result
->push_back (std::move (sal
));
114 /* See definition in probe.h. */
116 std::vector
<symtab_and_line
>
117 parse_probes (const struct event_location
*location
,
118 struct program_space
*search_pspace
,
119 struct linespec_result
*canonical
)
122 char *objfile_namestr
= NULL
, *provider
= NULL
, *name
, *p
;
123 const char *arg_start
, *cs
;
125 gdb_assert (event_location_type (location
) == PROBE_LOCATION
);
126 arg_start
= get_probe_location (location
);
129 const static_probe_ops
*spops
= probe_linespec_to_static_ops (&cs
);
131 error (_("'%s' is not a probe linespec"), arg_start
);
134 arg
= skip_spaces (arg
);
136 error (_("argument to `%s' missing"), arg_start
);
138 arg_end
= skip_to_space (arg
);
140 /* We make a copy here so we can write over parts with impunity. */
141 std::string
copy (arg
, arg_end
- arg
);
144 /* Extract each word from the argument, separated by ":"s. */
145 p
= strchr (arg
, ':');
148 /* This is `-p name'. */
156 p
= strchr (hold
, ':');
159 /* This is `-p provider:name'. */
165 /* This is `-p objfile:provider:name'. */
167 objfile_namestr
= arg
;
174 error (_("no probe name specified"));
175 if (provider
&& *provider
== '\0')
176 error (_("invalid provider name"));
177 if (objfile_namestr
&& *objfile_namestr
== '\0')
178 error (_("invalid objfile name"));
180 std::vector
<symtab_and_line
> result
;
181 if (search_pspace
!= NULL
)
183 parse_probes_in_pspace (spops
, search_pspace
, objfile_namestr
,
184 provider
, name
, &result
);
188 for (struct program_space
*pspace
: program_spaces
)
189 parse_probes_in_pspace (spops
, pspace
, objfile_namestr
,
190 provider
, name
, &result
);
195 throw_error (NOT_FOUND_ERROR
,
196 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
197 objfile_namestr
? objfile_namestr
: _("<any>"),
198 provider
? provider
: _("<any>"),
204 std::string
canon (arg_start
, arg_end
- arg_start
);
205 canonical
->special_display
= 1;
206 canonical
->pre_expanded
= 1;
207 canonical
->location
= new_probe_location (canon
.c_str ());
213 /* See definition in probe.h. */
216 find_probes_in_objfile (struct objfile
*objfile
, const char *provider
,
219 std::vector
<probe
*> result
;
221 if (!objfile
->sf
|| !objfile
->sf
->sym_probe_fns
)
224 const std::vector
<std::unique_ptr
<probe
>> &probes
225 = objfile
->sf
->sym_probe_fns
->sym_get_probes (objfile
);
226 for (auto &p
: probes
)
228 if (p
->get_provider () != provider
)
231 if (p
->get_name () != name
)
234 result
.push_back (p
.get ());
240 /* See definition in probe.h. */
243 find_probe_by_pc (CORE_ADDR pc
)
245 struct bound_probe result
;
247 result
.objfile
= NULL
;
250 for (objfile
*objfile
: current_program_space
->objfiles ())
252 if (!objfile
->sf
|| !objfile
->sf
->sym_probe_fns
253 || objfile
->sect_index_text
== -1)
256 /* If this proves too inefficient, we can replace with a hash. */
257 const std::vector
<std::unique_ptr
<probe
>> &probes
258 = objfile
->sf
->sym_probe_fns
->sym_get_probes (objfile
);
259 for (auto &p
: probes
)
260 if (p
->get_relocated_address (objfile
) == pc
)
262 result
.objfile
= objfile
;
263 result
.prob
= p
.get ();
273 /* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
274 If SPOPS is not &any_static_probe_ops, only probes related to this
275 specific static probe ops will match. Each argument is a regexp,
276 or NULL, which matches anything. */
278 static std::vector
<bound_probe
>
279 collect_probes (const std::string
&objname
, const std::string
&provider
,
280 const std::string
&probe_name
, const static_probe_ops
*spops
)
282 std::vector
<bound_probe
> result
;
283 gdb::optional
<compiled_regex
> obj_pat
, prov_pat
, probe_pat
;
285 if (!provider
.empty ())
286 prov_pat
.emplace (provider
.c_str (), REG_NOSUB
,
287 _("Invalid provider regexp"));
288 if (!probe_name
.empty ())
289 probe_pat
.emplace (probe_name
.c_str (), REG_NOSUB
,
290 _("Invalid probe regexp"));
291 if (!objname
.empty ())
292 obj_pat
.emplace (objname
.c_str (), REG_NOSUB
,
293 _("Invalid object file regexp"));
295 for (objfile
*objfile
: current_program_space
->objfiles ())
297 if (! objfile
->sf
|| ! objfile
->sf
->sym_probe_fns
)
302 if (obj_pat
->exec (objfile_name (objfile
), 0, NULL
, 0) != 0)
306 const std::vector
<std::unique_ptr
<probe
>> &probes
307 = objfile
->sf
->sym_probe_fns
->sym_get_probes (objfile
);
309 for (auto &p
: probes
)
311 if (spops
!= &any_static_probe_ops
&& p
->get_static_ops () != spops
)
315 && prov_pat
->exec (p
->get_provider ().c_str (), 0, NULL
, 0) != 0)
319 && probe_pat
->exec (p
->get_name ().c_str (), 0, NULL
, 0) != 0)
322 result
.emplace_back (p
.get (), objfile
);
329 /* A qsort comparison function for bound_probe_s objects. */
332 compare_probes (const bound_probe
&a
, const bound_probe
&b
)
336 v
= a
.prob
->get_provider ().compare (b
.prob
->get_provider ());
340 v
= a
.prob
->get_name ().compare (b
.prob
->get_name ());
344 if (a
.prob
->get_address () != b
.prob
->get_address ())
345 return a
.prob
->get_address () < b
.prob
->get_address ();
347 return strcmp (objfile_name (a
.objfile
), objfile_name (b
.objfile
)) < 0;
350 /* Helper function that generate entries in the ui_out table being
351 crafted by `info_probes_for_ops'. */
354 gen_ui_out_table_header_info (const std::vector
<bound_probe
> &probes
,
355 const static_probe_ops
*spops
)
357 /* `headings' refers to the names of the columns when printing `info
359 gdb_assert (spops
!= NULL
);
361 std::vector
<struct info_probe_column
> headings
362 = spops
->gen_info_probes_table_header ();
364 for (const info_probe_column
&column
: headings
)
366 size_t size_max
= strlen (column
.print_name
);
368 for (const bound_probe
&probe
: probes
)
370 /* `probe_fields' refers to the values of each new field that this
371 probe will display. */
373 if (probe
.prob
->get_static_ops () != spops
)
376 std::vector
<const char *> probe_fields
377 = probe
.prob
->gen_info_probes_table_values ();
379 gdb_assert (probe_fields
.size () == headings
.size ());
381 for (const char *val
: probe_fields
)
383 /* It is valid to have a NULL value here, which means that the
384 backend does not have something to write and this particular
385 field should be skipped. */
389 size_max
= std::max (strlen (val
), size_max
);
393 current_uiout
->table_header (size_max
, ui_left
,
394 column
.field_name
, column
.print_name
);
398 /* Helper function to print not-applicable strings for all the extra
399 columns defined in a static_probe_ops. */
402 print_ui_out_not_applicables (const static_probe_ops
*spops
)
404 std::vector
<struct info_probe_column
> headings
405 = spops
->gen_info_probes_table_header ();
407 for (const info_probe_column
&column
: headings
)
408 current_uiout
->field_string (column
.field_name
, _("n/a"));
411 /* Helper function to print extra information about a probe and an objfile
412 represented by PROBE. */
415 print_ui_out_info (probe
*probe
)
417 /* `values' refers to the actual values of each new field in the output
418 of `info probe'. `headings' refers to the names of each new field. */
419 gdb_assert (probe
!= NULL
);
420 std::vector
<struct info_probe_column
> headings
421 = probe
->get_static_ops ()->gen_info_probes_table_header ();
422 std::vector
<const char *> values
423 = probe
->gen_info_probes_table_values ();
425 gdb_assert (headings
.size () == values
.size ());
427 for (int ix
= 0; ix
< headings
.size (); ++ix
)
429 struct info_probe_column column
= headings
[ix
];
430 const char *val
= values
[ix
];
433 current_uiout
->field_skip (column
.field_name
);
435 current_uiout
->field_string (column
.field_name
, val
);
439 /* Helper function that returns the number of extra fields which POPS will
443 get_number_extra_fields (const static_probe_ops
*spops
)
445 return spops
->gen_info_probes_table_header ().size ();
448 /* Helper function that returns true if there is a probe in PROBES
449 featuring the given SPOPS. It returns false otherwise. */
452 exists_probe_with_spops (const std::vector
<bound_probe
> &probes
,
453 const static_probe_ops
*spops
)
455 for (const bound_probe
&probe
: probes
)
456 if (probe
.prob
->get_static_ops () == spops
)
462 /* Helper function that parses a probe linespec of the form [PROVIDER
463 [PROBE [OBJNAME]]] from the provided string STR. */
466 parse_probe_linespec (const char *str
, std::string
*provider
,
467 std::string
*probe_name
, std::string
*objname
)
469 *probe_name
= *objname
= "";
471 *provider
= extract_arg (&str
);
472 if (!provider
->empty ())
474 *probe_name
= extract_arg (&str
);
475 if (!probe_name
->empty ())
476 *objname
= extract_arg (&str
);
480 /* See comment in probe.h. */
483 info_probes_for_spops (const char *arg
, int from_tty
,
484 const static_probe_ops
*spops
)
486 std::string provider
, probe_name
, objname
;
488 int ui_out_extra_fields
= 0;
490 size_t size_name
= strlen ("Name");
491 size_t size_objname
= strlen ("Object");
492 size_t size_provider
= strlen ("Provider");
493 size_t size_type
= strlen ("Type");
494 struct gdbarch
*gdbarch
= get_current_arch ();
496 parse_probe_linespec (arg
, &provider
, &probe_name
, &objname
);
498 std::vector
<bound_probe
> probes
499 = collect_probes (objname
, provider
, probe_name
, spops
);
501 if (spops
== &any_static_probe_ops
)
503 /* If SPOPS is &any_static_probe_ops, it means the user has
504 requested a "simple" `info probes', i.e., she wants to print
505 all information about all probes. For that, we have to
506 identify how many extra fields we will need to add in the
509 To do that, we iterate over all static_probe_ops, querying
510 each one about its extra fields, and incrementing
511 `ui_out_extra_fields' to reflect that number. But note that
512 we ignore the static_probe_ops for which no probes are
513 defined with the given search criteria. */
515 for (const static_probe_ops
*po
: all_static_probe_ops
)
516 if (exists_probe_with_spops (probes
, po
))
517 ui_out_extra_fields
+= get_number_extra_fields (po
);
520 ui_out_extra_fields
= get_number_extra_fields (spops
);
523 ui_out_emit_table
table_emitter (current_uiout
,
524 5 + ui_out_extra_fields
,
525 probes
.size (), "StaticProbes");
527 std::sort (probes
.begin (), probes
.end (), compare_probes
);
529 /* What's the size of an address in our architecture? */
530 size_addr
= gdbarch_addr_bit (gdbarch
) == 64 ? 18 : 10;
532 /* Determining the maximum size of each field (`type', `provider',
533 `name' and `objname'). */
534 for (const bound_probe
&probe
: probes
)
536 const char *probe_type
= probe
.prob
->get_static_ops ()->type_name ();
538 size_type
= std::max (strlen (probe_type
), size_type
);
539 size_name
= std::max (probe
.prob
->get_name ().size (), size_name
);
540 size_provider
= std::max (probe
.prob
->get_provider ().size (),
542 size_objname
= std::max (strlen (objfile_name (probe
.objfile
)),
546 current_uiout
->table_header (size_type
, ui_left
, "type", _("Type"));
547 current_uiout
->table_header (size_provider
, ui_left
, "provider",
549 current_uiout
->table_header (size_name
, ui_left
, "name", _("Name"));
550 current_uiout
->table_header (size_addr
, ui_left
, "addr", _("Where"));
552 if (spops
== &any_static_probe_ops
)
554 /* We have to generate the table header for each new probe type
555 that we will print. Note that this excludes probe types not
556 having any defined probe with the search criteria. */
557 for (const static_probe_ops
*po
: all_static_probe_ops
)
558 if (exists_probe_with_spops (probes
, po
))
559 gen_ui_out_table_header_info (probes
, po
);
562 gen_ui_out_table_header_info (probes
, spops
);
564 current_uiout
->table_header (size_objname
, ui_left
, "object", _("Object"));
565 current_uiout
->table_body ();
567 for (const bound_probe
&probe
: probes
)
569 const char *probe_type
= probe
.prob
->get_static_ops ()->type_name ();
571 ui_out_emit_tuple
tuple_emitter (current_uiout
, "probe");
573 current_uiout
->field_string ("type", probe_type
);
574 current_uiout
->field_string ("provider",
575 probe
.prob
->get_provider ().c_str ());
576 current_uiout
->field_string ("name", probe
.prob
->get_name ().c_str ());
577 current_uiout
->field_core_addr ("addr", probe
.prob
->get_gdbarch (),
578 probe
.prob
->get_relocated_address
581 if (spops
== &any_static_probe_ops
)
583 for (const static_probe_ops
*po
: all_static_probe_ops
)
585 if (probe
.prob
->get_static_ops () == po
)
586 print_ui_out_info (probe
.prob
);
587 else if (exists_probe_with_spops (probes
, po
))
588 print_ui_out_not_applicables (po
);
592 print_ui_out_info (probe
.prob
);
594 current_uiout
->field_string ("object",
595 objfile_name (probe
.objfile
));
596 current_uiout
->text ("\n");
599 any_found
= !probes
.empty ();
603 current_uiout
->message (_("No probes matched.\n"));
606 /* Implementation of the `info probes' command. */
609 info_probes_command (const char *arg
, int from_tty
)
611 info_probes_for_spops (arg
, from_tty
, &any_static_probe_ops
);
614 /* Implementation of the `enable probes' command. */
617 enable_probes_command (const char *arg
, int from_tty
)
619 std::string provider
, probe_name
, objname
;
621 parse_probe_linespec ((const char *) arg
, &provider
, &probe_name
, &objname
);
623 std::vector
<bound_probe
> probes
624 = collect_probes (objname
, provider
, probe_name
, &any_static_probe_ops
);
627 current_uiout
->message (_("No probes matched.\n"));
631 /* Enable the selected probes, provided their backends support the
632 notion of enabling a probe. */
633 for (const bound_probe
&probe
: probes
)
635 if (probe
.prob
->get_static_ops ()->can_enable ())
637 probe
.prob
->enable ();
638 current_uiout
->message (_("Probe %s:%s enabled.\n"),
639 probe
.prob
->get_provider ().c_str (),
640 probe
.prob
->get_name ().c_str ());
643 current_uiout
->message (_("Probe %s:%s cannot be enabled.\n"),
644 probe
.prob
->get_provider ().c_str (),
645 probe
.prob
->get_name ().c_str ());
649 /* Implementation of the `disable probes' command. */
652 disable_probes_command (const char *arg
, int from_tty
)
654 std::string provider
, probe_name
, objname
;
656 parse_probe_linespec ((const char *) arg
, &provider
, &probe_name
, &objname
);
658 std::vector
<bound_probe
> probes
659 = collect_probes (objname
, provider
, probe_name
, &any_static_probe_ops
);
662 current_uiout
->message (_("No probes matched.\n"));
666 /* Disable the selected probes, provided their backends support the
667 notion of enabling a probe. */
668 for (const bound_probe
&probe
: probes
)
670 if (probe
.prob
->get_static_ops ()->can_enable ())
672 probe
.prob
->disable ();
673 current_uiout
->message (_("Probe %s:%s disabled.\n"),
674 probe
.prob
->get_provider ().c_str (),
675 probe
.prob
->get_name ().c_str ());
678 current_uiout
->message (_("Probe %s:%s cannot be disabled.\n"),
679 probe
.prob
->get_provider ().c_str (),
680 probe
.prob
->get_name ().c_str ());
684 /* See comments in probe.h. */
687 probe_safe_evaluate_at_pc (struct frame_info
*frame
, unsigned n
)
689 struct bound_probe probe
;
692 probe
= find_probe_by_pc (get_frame_pc (frame
));
696 n_args
= probe
.prob
->get_argument_count (get_frame_arch (frame
));
700 return probe
.prob
->evaluate_argument (n
, frame
);
703 /* See comment in probe.h. */
705 const struct static_probe_ops
*
706 probe_linespec_to_static_ops (const char **linespecp
)
708 for (const static_probe_ops
*ops
: all_static_probe_ops
)
709 if (ops
->is_linespec (linespecp
))
715 /* See comment in probe.h. */
718 probe_is_linespec_by_keyword (const char **linespecp
, const char *const *keywords
)
720 const char *s
= *linespecp
;
721 const char *const *csp
;
723 for (csp
= keywords
; *csp
; csp
++)
725 const char *keyword
= *csp
;
726 size_t len
= strlen (keyword
);
728 if (strncmp (s
, keyword
, len
) == 0 && isspace (s
[len
]))
730 *linespecp
+= len
+ 1;
738 /* Implementation of `is_linespec' method. */
741 any_static_probe_ops::is_linespec (const char **linespecp
) const
743 static const char *const keywords
[] = { "-p", "-probe", NULL
};
745 return probe_is_linespec_by_keyword (linespecp
, keywords
);
748 /* Implementation of 'get_probes' method. */
751 any_static_probe_ops::get_probes (std::vector
<std::unique_ptr
<probe
>> *probesp
,
752 struct objfile
*objfile
) const
754 /* No probes can be provided by this dummy backend. */
757 /* Implementation of the 'type_name' method. */
760 any_static_probe_ops::type_name () const
765 /* Implementation of the 'gen_info_probes_table_header' method. */
767 std::vector
<struct info_probe_column
>
768 any_static_probe_ops::gen_info_probes_table_header () const
770 return std::vector
<struct info_probe_column
> ();
773 /* See comments in probe.h. */
775 struct cmd_list_element
**
776 info_probes_cmdlist_get (void)
778 static struct cmd_list_element
*info_probes_cmdlist
;
780 if (info_probes_cmdlist
== NULL
)
781 add_prefix_cmd ("probes", class_info
, info_probes_command
,
783 Show available static probes.\n\
784 Usage: info probes [all|TYPE [ARGS]]\n\
785 TYPE specifies the type of the probe, and can be one of the following:\n\
787 If you specify TYPE, there may be additional arguments needed by the\n\
789 If you do not specify any argument, or specify `all', then the command\n\
790 will show information about all types of probes."),
791 &info_probes_cmdlist
, 0/*allow-unknown*/, &infolist
);
793 return &info_probes_cmdlist
;
798 /* This is called to compute the value of one of the $_probe_arg*
799 convenience variables. */
801 static struct value
*
802 compute_probe_arg (struct gdbarch
*arch
, struct internalvar
*ivar
,
805 struct frame_info
*frame
= get_selected_frame (_("No frame selected"));
806 CORE_ADDR pc
= get_frame_pc (frame
);
807 int sel
= (int) (uintptr_t) data
;
808 struct bound_probe pc_probe
;
811 /* SEL == -1 means "_probe_argc". */
812 gdb_assert (sel
>= -1);
814 pc_probe
= find_probe_by_pc (pc
);
815 if (pc_probe
.prob
== NULL
)
816 error (_("No probe at PC %s"), core_addr_to_string (pc
));
818 n_args
= pc_probe
.prob
->get_argument_count (arch
);
820 return value_from_longest (builtin_type (arch
)->builtin_int
, n_args
);
823 error (_("Invalid probe argument %d -- probe has %u arguments available"),
826 return pc_probe
.prob
->evaluate_argument (sel
, frame
);
829 /* This is called to compile one of the $_probe_arg* convenience
830 variables into an agent expression. */
833 compile_probe_arg (struct internalvar
*ivar
, struct agent_expr
*expr
,
834 struct axs_value
*value
, void *data
)
836 CORE_ADDR pc
= expr
->scope
;
837 int sel
= (int) (uintptr_t) data
;
838 struct bound_probe pc_probe
;
841 /* SEL == -1 means "_probe_argc". */
842 gdb_assert (sel
>= -1);
844 pc_probe
= find_probe_by_pc (pc
);
845 if (pc_probe
.prob
== NULL
)
846 error (_("No probe at PC %s"), core_addr_to_string (pc
));
848 n_args
= pc_probe
.prob
->get_argument_count (expr
->gdbarch
);
852 value
->kind
= axs_rvalue
;
853 value
->type
= builtin_type (expr
->gdbarch
)->builtin_int
;
854 ax_const_l (expr
, n_args
);
858 gdb_assert (sel
>= 0);
860 error (_("Invalid probe argument %d -- probe has %d arguments available"),
863 pc_probe
.prob
->compile_to_ax (expr
, value
, sel
);
866 static const struct internalvar_funcs probe_funcs
=
874 std::vector
<const static_probe_ops
*> all_static_probe_ops
;
876 void _initialize_probe ();
880 all_static_probe_ops
.push_back (&any_static_probe_ops
);
882 create_internalvar_type_lazy ("_probe_argc", &probe_funcs
,
883 (void *) (uintptr_t) -1);
884 create_internalvar_type_lazy ("_probe_arg0", &probe_funcs
,
885 (void *) (uintptr_t) 0);
886 create_internalvar_type_lazy ("_probe_arg1", &probe_funcs
,
887 (void *) (uintptr_t) 1);
888 create_internalvar_type_lazy ("_probe_arg2", &probe_funcs
,
889 (void *) (uintptr_t) 2);
890 create_internalvar_type_lazy ("_probe_arg3", &probe_funcs
,
891 (void *) (uintptr_t) 3);
892 create_internalvar_type_lazy ("_probe_arg4", &probe_funcs
,
893 (void *) (uintptr_t) 4);
894 create_internalvar_type_lazy ("_probe_arg5", &probe_funcs
,
895 (void *) (uintptr_t) 5);
896 create_internalvar_type_lazy ("_probe_arg6", &probe_funcs
,
897 (void *) (uintptr_t) 6);
898 create_internalvar_type_lazy ("_probe_arg7", &probe_funcs
,
899 (void *) (uintptr_t) 7);
900 create_internalvar_type_lazy ("_probe_arg8", &probe_funcs
,
901 (void *) (uintptr_t) 8);
902 create_internalvar_type_lazy ("_probe_arg9", &probe_funcs
,
903 (void *) (uintptr_t) 9);
904 create_internalvar_type_lazy ("_probe_arg10", &probe_funcs
,
905 (void *) (uintptr_t) 10);
906 create_internalvar_type_lazy ("_probe_arg11", &probe_funcs
,
907 (void *) (uintptr_t) 11);
909 add_cmd ("all", class_info
, info_probes_command
,
911 Show information about all type of probes."),
912 info_probes_cmdlist_get ());
914 add_cmd ("probes", class_breakpoint
, enable_probes_command
, _("\
916 Usage: enable probes [PROVIDER [NAME [OBJECT]]]\n\
917 Each argument is a regular expression, used to select probes.\n\
918 PROVIDER matches probe provider names.\n\
919 NAME matches the probe names.\n\
920 OBJECT matches the executable or shared library name.\n\
921 If you do not specify any argument then the command will enable\n\
922 all defined probes."),
925 add_cmd ("probes", class_breakpoint
, disable_probes_command
, _("\
927 Usage: disable probes [PROVIDER [NAME [OBJECT]]]\n\
928 Each argument is a regular expression, used to select probes.\n\
929 PROVIDER matches probe provider names.\n\
930 NAME matches the probe names.\n\
931 OBJECT matches the executable or shared library name.\n\
932 If you do not specify any argument then the command will disable\n\
933 all defined probes."),