* ppc-tdep.h (ppc_insns_match_pattern): Update prototype.
[deliverable/binutils-gdb.git] / gdb / probe.c
CommitLineData
55aa24fb
SDJ
1/* Generic static probe support for GDB.
2
28e7fd62 3 Copyright (C) 2012-2013 Free Software Foundation, Inc.
55aa24fb
SDJ
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20#include "defs.h"
21#include "probe.h"
22#include "command.h"
23#include "cli/cli-cmds.h"
24#include "cli/cli-utils.h"
25#include "objfiles.h"
26#include "symtab.h"
27#include "progspace.h"
28#include "filenames.h"
29#include "exceptions.h"
30#include "linespec.h"
31#include "gdb_regex.h"
32#include "frame.h"
33#include "arch-utils.h"
34#include <ctype.h>
35
36\f
37
38/* See definition in probe.h. */
39
40struct symtabs_and_lines
41parse_probes (char **argptr, struct linespec_result *canonical)
42{
43 char *arg_start, *arg_end, *arg;
44 char *objfile_name = NULL, *provider = NULL, *name, *p;
45 struct cleanup *cleanup;
46 struct symtabs_and_lines result;
47 struct objfile *objfile;
48 struct program_space *pspace;
49 const struct probe_ops *probe_ops;
50 const char *cs;
51
52 result.sals = NULL;
53 result.nelts = 0;
54
55 arg_start = *argptr;
56
57 cs = *argptr;
58 probe_ops = probe_linespec_to_ops (&cs);
59 gdb_assert (probe_ops != NULL);
60
61 arg = (char *) cs;
62 arg = skip_spaces (arg);
63 if (!*arg)
64 error (_("argument to `%s' missing"), arg_start);
65
66 arg_end = skip_to_space (arg);
67
68 /* We make a copy here so we can write over parts with impunity. */
69 arg = savestring (arg, arg_end - arg);
70 cleanup = make_cleanup (xfree, arg);
71
72 /* Extract each word from the argument, separated by ":"s. */
73 p = strchr (arg, ':');
74 if (p == NULL)
75 {
76 /* This is `-p name'. */
77 name = arg;
78 }
79 else
80 {
81 char *hold = p + 1;
82
83 *p = '\0';
84 p = strchr (hold, ':');
85 if (p == NULL)
86 {
87 /* This is `-p provider:name'. */
88 provider = arg;
89 name = hold;
90 }
91 else
92 {
93 /* This is `-p objfile:provider:name'. */
94 *p = '\0';
95 objfile_name = arg;
96 provider = hold;
97 name = p + 1;
98 }
99 }
100
101 if (*name == '\0')
102 error (_("no probe name specified"));
103 if (provider && *provider == '\0')
104 error (_("invalid provider name"));
105 if (objfile_name && *objfile_name == '\0')
106 error (_("invalid objfile name"));
107
108 ALL_PSPACES (pspace)
109 ALL_PSPACE_OBJFILES (pspace, objfile)
110 {
111 VEC (probe_p) *probes;
112 struct probe *probe;
113 int ix;
114
115 if (!objfile->sf || !objfile->sf->sym_probe_fns)
116 continue;
117
118 if (objfile_name
119 && FILENAME_CMP (objfile->name, objfile_name) != 0
120 && FILENAME_CMP (lbasename (objfile->name), objfile_name) != 0)
121 continue;
122
55aa24fb
SDJ
123 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
124
125 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
126 {
127 struct symtab_and_line *sal;
128
129 if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
130 continue;
131
132 if (provider && strcmp (probe->provider, provider) != 0)
133 continue;
134
135 if (strcmp (probe->name, name) != 0)
136 continue;
137
138 ++result.nelts;
139 result.sals = xrealloc (result.sals,
140 result.nelts
141 * sizeof (struct symtab_and_line));
142 sal = &result.sals[result.nelts - 1];
143
144 init_sal (sal);
145
146 sal->pc = probe->address;
147 sal->explicit_pc = 1;
148 sal->section = find_pc_overlay (sal->pc);
149 sal->pspace = pspace;
150 sal->probe = probe;
151 }
152 }
153
154 if (result.nelts == 0)
155 {
156 throw_error (NOT_FOUND_ERROR,
157 _("No probe matching objfile=`%s', provider=`%s', name=`%s'"),
158 objfile_name ? objfile_name : _("<any>"),
159 provider ? provider : _("<any>"),
160 name);
161 }
162
163 if (canonical)
164 {
165 canonical->special_display = 1;
166 canonical->pre_expanded = 1;
167 canonical->addr_string = savestring (*argptr, arg_end - *argptr);
168 }
169
170 *argptr = arg_end;
171 do_cleanups (cleanup);
172
173 return result;
174}
175
176/* See definition in probe.h. */
177
178VEC (probe_p) *
179find_probes_in_objfile (struct objfile *objfile, const char *provider,
180 const char *name)
181{
182 VEC (probe_p) *probes, *result = NULL;
183 int ix;
184 struct probe *probe;
185
186 if (!objfile->sf || !objfile->sf->sym_probe_fns)
187 return NULL;
188
189 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
190 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
191 {
192 if (strcmp (probe->provider, provider) != 0)
193 continue;
194
195 if (strcmp (probe->name, name) != 0)
196 continue;
197
198 VEC_safe_push (probe_p, result, probe);
199 }
200
201 return result;
202}
203
204/* See definition in probe.h. */
205
206struct probe *
6bac7473 207find_probe_by_pc (CORE_ADDR pc)
55aa24fb
SDJ
208{
209 struct objfile *objfile;
210
211 ALL_OBJFILES (objfile)
212 {
213 VEC (probe_p) *probes;
214 int ix;
215 struct probe *probe;
216
217 if (!objfile->sf || !objfile->sf->sym_probe_fns)
218 continue;
219
220 /* If this proves too inefficient, we can replace with a hash. */
221 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
222 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
223 if (probe->address == pc)
6bac7473 224 return probe;
55aa24fb
SDJ
225 }
226
227 return NULL;
228}
229
230\f
231
55aa24fb
SDJ
232/* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
233 If POPS is not NULL, only probes of this certain probe_ops will match.
234 Each argument is a regexp, or NULL, which matches anything. */
235
6bac7473 236static VEC (probe_p) *
55aa24fb
SDJ
237collect_probes (char *objname, char *provider, char *probe_name,
238 const struct probe_ops *pops)
239{
240 struct objfile *objfile;
6bac7473 241 VEC (probe_p) *result = NULL;
55aa24fb
SDJ
242 struct cleanup *cleanup, *cleanup_temps;
243 regex_t obj_pat, prov_pat, probe_pat;
244
6bac7473 245 cleanup = make_cleanup (VEC_cleanup (probe_p), &result);
55aa24fb
SDJ
246
247 cleanup_temps = make_cleanup (null_cleanup, NULL);
db26349c
TT
248 if (provider != NULL)
249 compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
250 if (probe_name != NULL)
251 compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
252 if (objname != NULL)
253 compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
55aa24fb
SDJ
254
255 ALL_OBJFILES (objfile)
256 {
257 VEC (probe_p) *probes;
258 struct probe *probe;
259 int ix;
260
261 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
262 continue;
263
264 if (objname)
265 {
266 if (regexec (&obj_pat, objfile->name, 0, NULL, 0) != 0)
267 continue;
268 }
269
270 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
271
272 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
273 {
55aa24fb
SDJ
274 if (pops != NULL && probe->pops != pops)
275 continue;
276
277 if (provider
278 && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
279 continue;
280
281 if (probe_name
282 && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
283 continue;
284
6bac7473 285 VEC_safe_push (probe_p, result, probe);
55aa24fb
SDJ
286 }
287 }
288
289 do_cleanups (cleanup_temps);
290 discard_cleanups (cleanup);
291 return result;
292}
293
6bac7473 294/* A qsort comparison function for probe_p objects. */
55aa24fb
SDJ
295
296static int
6bac7473 297compare_probes (const void *a, const void *b)
55aa24fb 298{
6bac7473
SDJ
299 const struct probe *pa = *((const struct probe **) a);
300 const struct probe *pb = *((const struct probe **) b);
55aa24fb
SDJ
301 int v;
302
6bac7473 303 v = strcmp (pa->provider, pb->provider);
55aa24fb
SDJ
304 if (v)
305 return v;
306
6bac7473 307 v = strcmp (pa->name, pb->name);
55aa24fb
SDJ
308 if (v)
309 return v;
310
6bac7473 311 if (pa->address < pb->address)
55aa24fb 312 return -1;
6bac7473 313 if (pa->address > pb->address)
55aa24fb
SDJ
314 return 1;
315
6bac7473 316 return strcmp (pa->objfile->name, pb->objfile->name);
55aa24fb
SDJ
317}
318
319/* Helper function that generate entries in the ui_out table being
320 crafted by `info_probes_for_ops'. */
321
322static void
6bac7473 323gen_ui_out_table_header_info (VEC (probe_p) *probes,
55aa24fb
SDJ
324 const struct probe_ops *p)
325{
326 /* `headings' refers to the names of the columns when printing `info
327 probes'. */
328 VEC (info_probe_column_s) *headings = NULL;
329 struct cleanup *c;
330 info_probe_column_s *column;
331 size_t headings_size;
332 int ix;
333
334 gdb_assert (p != NULL);
335
336 if (p->gen_info_probes_table_header == NULL
337 && p->gen_info_probes_table_values == NULL)
338 return;
339
340 gdb_assert (p->gen_info_probes_table_header != NULL
341 && p->gen_info_probes_table_values != NULL);
342
343 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
344 p->gen_info_probes_table_header (&headings);
345
346 headings_size = VEC_length (info_probe_column_s, headings);
347
348 for (ix = 0;
349 VEC_iterate (info_probe_column_s, headings, ix, column);
350 ++ix)
351 {
6bac7473 352 struct probe *probe;
55aa24fb
SDJ
353 int jx;
354 size_t size_max = strlen (column->print_name);
355
6bac7473 356 for (jx = 0; VEC_iterate (probe_p, probes, jx, probe); ++jx)
55aa24fb
SDJ
357 {
358 /* `probe_fields' refers to the values of each new field that this
359 probe will display. */
360 VEC (const_char_ptr) *probe_fields = NULL;
361 struct cleanup *c2;
362 const char *val;
363 int kx;
364
6bac7473 365 if (probe->pops != p)
55aa24fb
SDJ
366 continue;
367
368 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
6bac7473 369 p->gen_info_probes_table_values (probe, &probe_fields);
55aa24fb
SDJ
370
371 gdb_assert (VEC_length (const_char_ptr, probe_fields)
372 == headings_size);
373
374 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
375 ++kx)
376 {
377 /* It is valid to have a NULL value here, which means that the
378 backend does not have something to write and this particular
379 field should be skipped. */
380 if (val == NULL)
381 continue;
382
383 size_max = max (strlen (val), size_max);
384 }
385 do_cleanups (c2);
386 }
387
388 ui_out_table_header (current_uiout, size_max, ui_left,
389 column->field_name, column->print_name);
390 }
391
392 do_cleanups (c);
393}
394
395/* Helper function to print extra information about a probe and an objfile
6bac7473 396 represented by PROBE. */
55aa24fb
SDJ
397
398static void
6bac7473 399print_ui_out_info (struct probe *probe)
55aa24fb
SDJ
400{
401 int ix;
402 int j = 0;
403 /* `values' refers to the actual values of each new field in the output
404 of `info probe'. `headings' refers to the names of each new field. */
405 VEC (const_char_ptr) *values = NULL;
406 VEC (info_probe_column_s) *headings = NULL;
407 info_probe_column_s *column;
408 struct cleanup *c;
409
6bac7473
SDJ
410 gdb_assert (probe != NULL);
411 gdb_assert (probe->pops != NULL);
55aa24fb 412
6bac7473
SDJ
413 if (probe->pops->gen_info_probes_table_header == NULL
414 && probe->pops->gen_info_probes_table_values == NULL)
55aa24fb
SDJ
415 return;
416
6bac7473
SDJ
417 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
418 && probe->pops->gen_info_probes_table_values != NULL);
55aa24fb
SDJ
419
420 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
421 make_cleanup (VEC_cleanup (const_char_ptr), &values);
422
6bac7473
SDJ
423 probe->pops->gen_info_probes_table_header (&headings);
424 probe->pops->gen_info_probes_table_values (probe, &values);
55aa24fb
SDJ
425
426 gdb_assert (VEC_length (info_probe_column_s, headings)
427 == VEC_length (const_char_ptr, values));
428
429 for (ix = 0;
430 VEC_iterate (info_probe_column_s, headings, ix, column);
431 ++ix)
432 {
433 const char *val = VEC_index (const_char_ptr, values, j++);
434
435 if (val == NULL)
436 ui_out_field_skip (current_uiout, column->field_name);
437 else
438 ui_out_field_string (current_uiout, column->field_name, val);
439 }
440
441 do_cleanups (c);
442}
443
444/* Helper function that returns the number of extra fields which POPS will
445 need. */
446
447static int
448get_number_extra_fields (const struct probe_ops *pops)
449{
450 VEC (info_probe_column_s) *headings = NULL;
451 struct cleanup *c;
452 int n;
453
454 if (pops->gen_info_probes_table_header == NULL)
455 return 0;
456
457 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
458 pops->gen_info_probes_table_header (&headings);
459
460 n = VEC_length (info_probe_column_s, headings);
461
462 do_cleanups (c);
463
464 return n;
465}
466
467/* See comment in probe.h. */
468
469void
470info_probes_for_ops (char *arg, int from_tty, const struct probe_ops *pops)
471{
6bac7473 472 char *provider, *probe_name = NULL, *objname = NULL;
55aa24fb 473 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
6bac7473 474 VEC (probe_p) *probes;
55aa24fb
SDJ
475 int i, any_found;
476 int ui_out_extra_fields = 0;
477 size_t size_addr;
478 size_t size_name = strlen ("Name");
479 size_t size_objname = strlen ("Object");
480 size_t size_provider = strlen ("Provider");
6bac7473 481 struct probe *probe;
55aa24fb
SDJ
482 struct gdbarch *gdbarch = get_current_arch ();
483
484 /* Do we have a `provider:probe:objfile' style of linespec? */
485 provider = extract_arg (&arg);
486 if (provider)
487 {
488 make_cleanup (xfree, provider);
489
6bac7473
SDJ
490 probe_name = extract_arg (&arg);
491 if (probe_name)
55aa24fb 492 {
6bac7473 493 make_cleanup (xfree, probe_name);
55aa24fb
SDJ
494
495 objname = extract_arg (&arg);
496 if (objname)
497 make_cleanup (xfree, objname);
498 }
499 }
500
501 if (pops == NULL)
502 {
503 const struct probe_ops *po;
504 int ix;
505
506 /* If the probe_ops is NULL, it means the user has requested a "simple"
507 `info probes', i.e., she wants to print all information about all
508 probes. For that, we have to identify how many extra fields we will
509 need to add in the ui_out table.
510
511 To do that, we iterate over all probe_ops, querying each one about
512 its extra fields, and incrementing `ui_out_extra_fields' to reflect
513 that number. */
514
515 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
516 ui_out_extra_fields += get_number_extra_fields (po);
517 }
518 else
519 ui_out_extra_fields = get_number_extra_fields (pops);
520
6bac7473
SDJ
521 probes = collect_probes (objname, provider, probe_name, pops);
522 make_cleanup (VEC_cleanup (probe_p), &probes);
55aa24fb
SDJ
523 make_cleanup_ui_out_table_begin_end (current_uiout,
524 4 + ui_out_extra_fields,
6bac7473 525 VEC_length (probe_p, probes),
55aa24fb
SDJ
526 "StaticProbes");
527
6bac7473
SDJ
528 if (!VEC_empty (probe_p, probes))
529 qsort (VEC_address (probe_p, probes), VEC_length (probe_p, probes),
530 sizeof (probe_p), compare_probes);
55aa24fb
SDJ
531
532 /* What's the size of an address in our architecture? */
533 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
534
535 /* Determining the maximum size of each field (`provider', `name' and
536 `objname'). */
6bac7473 537 for (i = 0; VEC_iterate (probe_p, probes, i, probe); ++i)
55aa24fb 538 {
6bac7473
SDJ
539 size_name = max (strlen (probe->name), size_name);
540 size_provider = max (strlen (probe->provider), size_provider);
541 size_objname = max (strlen (probe->objfile->name), size_objname);
55aa24fb
SDJ
542 }
543
544 ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
545 _("Provider"));
546 ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
547 ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
548
549 if (pops == NULL)
550 {
551 const struct probe_ops *po;
552 int ix;
553
554 /* We have to generate the table header for each new probe type that we
555 will print. */
556 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
6bac7473 557 gen_ui_out_table_header_info (probes, po);
55aa24fb
SDJ
558 }
559 else
6bac7473 560 gen_ui_out_table_header_info (probes, pops);
55aa24fb
SDJ
561
562 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
563 _("Object"));
564 ui_out_table_body (current_uiout);
565
6bac7473 566 for (i = 0; VEC_iterate (probe_p, probes, i, probe); ++i)
55aa24fb
SDJ
567 {
568 struct cleanup *inner;
569
570 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
571
6bac7473
SDJ
572 ui_out_field_string (current_uiout, "provider", probe->provider);
573 ui_out_field_string (current_uiout, "name", probe->name);
55aa24fb 574 ui_out_field_core_addr (current_uiout, "addr",
6bac7473
SDJ
575 get_objfile_arch (probe->objfile),
576 probe->address);
55aa24fb
SDJ
577
578 if (pops == NULL)
579 {
580 const struct probe_ops *po;
581 int ix;
582
583 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
584 ++ix)
6bac7473
SDJ
585 if (probe->pops == po)
586 print_ui_out_info (probe);
55aa24fb
SDJ
587 }
588 else
6bac7473 589 print_ui_out_info (probe);
55aa24fb 590
6bac7473 591 ui_out_field_string (current_uiout, "object", probe->objfile->name);
55aa24fb
SDJ
592 ui_out_text (current_uiout, "\n");
593
594 do_cleanups (inner);
595 }
596
6bac7473 597 any_found = !VEC_empty (probe_p, probes);
55aa24fb
SDJ
598 do_cleanups (cleanup);
599
600 if (!any_found)
601 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
602}
603
604/* Implementation of the `info probes' command. */
605
606static void
607info_probes_command (char *arg, int from_tty)
608{
609 info_probes_for_ops (arg, from_tty, NULL);
610}
611
612/* See comments in probe.h. */
613
614struct value *
615probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
616{
617 struct probe *probe;
6bac7473 618 const struct sym_probe_fns *probe_fns;
2b963b68 619 unsigned n_args;
55aa24fb 620
6bac7473 621 probe = find_probe_by_pc (get_frame_pc (frame));
55aa24fb
SDJ
622 if (!probe)
623 return NULL;
55aa24fb 624
6bac7473
SDJ
625 gdb_assert (probe->objfile != NULL);
626 gdb_assert (probe->objfile->sf != NULL);
627 gdb_assert (probe->objfile->sf->sym_probe_fns != NULL);
628
629 probe_fns = probe->objfile->sf->sym_probe_fns;
2b963b68 630 n_args = probe_fns->sym_get_probe_argument_count (probe);
6bac7473 631
2b963b68 632 if (n >= n_args)
55aa24fb
SDJ
633 return NULL;
634
6bac7473 635 return probe_fns->sym_evaluate_probe_argument (probe, n);
55aa24fb
SDJ
636}
637
638/* See comment in probe.h. */
639
640const struct probe_ops *
641probe_linespec_to_ops (const char **linespecp)
642{
643 int ix;
644 const struct probe_ops *probe_ops;
645
646 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
647 if (probe_ops->is_linespec (linespecp))
648 return probe_ops;
649
650 return NULL;
651}
652
653/* See comment in probe.h. */
654
655int
656probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
657{
658 const char *s = *linespecp;
659 const char *const *csp;
660
661 for (csp = keywords; *csp; csp++)
662 {
663 const char *keyword = *csp;
664 size_t len = strlen (keyword);
665
666 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
667 {
668 *linespecp += len + 1;
669 return 1;
670 }
671 }
672
673 return 0;
674}
675
676/* Implementation of `is_linespec' method for `struct probe_ops'. */
677
678static int
679probe_any_is_linespec (const char **linespecp)
680{
681 static const char *const keywords[] = { "-p", "-probe", NULL };
682
683 return probe_is_linespec_by_keyword (linespecp, keywords);
684}
685
686/* Dummy method used for `probe_ops_any'. */
687
688static void
689probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
690{
691 /* No probes can be provided by this dummy backend. */
692}
693
694/* Operations associated with a generic probe. */
695
696const struct probe_ops probe_ops_any =
697{
698 probe_any_is_linespec,
699 probe_any_get_probes,
700};
701
702/* See comments in probe.h. */
703
704struct cmd_list_element **
705info_probes_cmdlist_get (void)
706{
707 static struct cmd_list_element *info_probes_cmdlist;
708
709 if (info_probes_cmdlist == NULL)
710 add_prefix_cmd ("probes", class_info, info_probes_command,
711 _("\
712Show available static probes.\n\
713Usage: info probes [all|TYPE [ARGS]]\n\
714TYPE specifies the type of the probe, and can be one of the following:\n\
715 - stap\n\
716If you specify TYPE, there may be additional arguments needed by the\n\
717subcommand.\n\
718If you do not specify any argument, or specify `all', then the command\n\
719will show information about all types of probes."),
720 &info_probes_cmdlist, "info probes ",
721 0/*allow-unknown*/, &infolist);
722
723 return &info_probes_cmdlist;
724}
725
726VEC (probe_ops_cp) *all_probe_ops;
727
728void _initialize_probe (void);
729
730void
731_initialize_probe (void)
732{
733 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
734
735 add_cmd ("all", class_info, info_probes_command,
736 _("\
737Show information about all type of probes."),
738 info_probes_cmdlist_get ());
739}
This page took 0.215058 seconds and 4 git commands to generate.