* gas/nios2/nios2.exp: Add copyright.
[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/* A helper function for collect_probes that compiles a regexp and
233 throws an exception on error. This installs a cleanup to free the
234 resulting pattern on success. If RX is NULL, this does nothing. */
235
236static void
237compile_rx_or_error (regex_t *pattern, const char *rx, const char *message)
238{
239 int code;
240
241 if (!rx)
242 return;
243
244 code = regcomp (pattern, rx, REG_NOSUB);
245 if (code == 0)
246 make_regfree_cleanup (pattern);
247 else
248 {
249 char *err = get_regcomp_error (code, pattern);
250
251 make_cleanup (xfree, err);
72d59e0d 252 error (("%s: %s"), message, err);
55aa24fb
SDJ
253 }
254}
255
256/* Make a vector of probes matching OBJNAME, PROVIDER, and PROBE_NAME.
257 If POPS is not NULL, only probes of this certain probe_ops will match.
258 Each argument is a regexp, or NULL, which matches anything. */
259
6bac7473 260static VEC (probe_p) *
55aa24fb
SDJ
261collect_probes (char *objname, char *provider, char *probe_name,
262 const struct probe_ops *pops)
263{
264 struct objfile *objfile;
6bac7473 265 VEC (probe_p) *result = NULL;
55aa24fb
SDJ
266 struct cleanup *cleanup, *cleanup_temps;
267 regex_t obj_pat, prov_pat, probe_pat;
268
6bac7473 269 cleanup = make_cleanup (VEC_cleanup (probe_p), &result);
55aa24fb
SDJ
270
271 cleanup_temps = make_cleanup (null_cleanup, NULL);
272 compile_rx_or_error (&prov_pat, provider, _("Invalid provider regexp"));
273 compile_rx_or_error (&probe_pat, probe_name, _("Invalid probe regexp"));
274 compile_rx_or_error (&obj_pat, objname, _("Invalid object file regexp"));
275
276 ALL_OBJFILES (objfile)
277 {
278 VEC (probe_p) *probes;
279 struct probe *probe;
280 int ix;
281
282 if (! objfile->sf || ! objfile->sf->sym_probe_fns)
283 continue;
284
285 if (objname)
286 {
287 if (regexec (&obj_pat, objfile->name, 0, NULL, 0) != 0)
288 continue;
289 }
290
291 probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
292
293 for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++)
294 {
55aa24fb
SDJ
295 if (pops != NULL && probe->pops != pops)
296 continue;
297
298 if (provider
299 && regexec (&prov_pat, probe->provider, 0, NULL, 0) != 0)
300 continue;
301
302 if (probe_name
303 && regexec (&probe_pat, probe->name, 0, NULL, 0) != 0)
304 continue;
305
6bac7473 306 VEC_safe_push (probe_p, result, probe);
55aa24fb
SDJ
307 }
308 }
309
310 do_cleanups (cleanup_temps);
311 discard_cleanups (cleanup);
312 return result;
313}
314
6bac7473 315/* A qsort comparison function for probe_p objects. */
55aa24fb
SDJ
316
317static int
6bac7473 318compare_probes (const void *a, const void *b)
55aa24fb 319{
6bac7473
SDJ
320 const struct probe *pa = *((const struct probe **) a);
321 const struct probe *pb = *((const struct probe **) b);
55aa24fb
SDJ
322 int v;
323
6bac7473 324 v = strcmp (pa->provider, pb->provider);
55aa24fb
SDJ
325 if (v)
326 return v;
327
6bac7473 328 v = strcmp (pa->name, pb->name);
55aa24fb
SDJ
329 if (v)
330 return v;
331
6bac7473 332 if (pa->address < pb->address)
55aa24fb 333 return -1;
6bac7473 334 if (pa->address > pb->address)
55aa24fb
SDJ
335 return 1;
336
6bac7473 337 return strcmp (pa->objfile->name, pb->objfile->name);
55aa24fb
SDJ
338}
339
340/* Helper function that generate entries in the ui_out table being
341 crafted by `info_probes_for_ops'. */
342
343static void
6bac7473 344gen_ui_out_table_header_info (VEC (probe_p) *probes,
55aa24fb
SDJ
345 const struct probe_ops *p)
346{
347 /* `headings' refers to the names of the columns when printing `info
348 probes'. */
349 VEC (info_probe_column_s) *headings = NULL;
350 struct cleanup *c;
351 info_probe_column_s *column;
352 size_t headings_size;
353 int ix;
354
355 gdb_assert (p != NULL);
356
357 if (p->gen_info_probes_table_header == NULL
358 && p->gen_info_probes_table_values == NULL)
359 return;
360
361 gdb_assert (p->gen_info_probes_table_header != NULL
362 && p->gen_info_probes_table_values != NULL);
363
364 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
365 p->gen_info_probes_table_header (&headings);
366
367 headings_size = VEC_length (info_probe_column_s, headings);
368
369 for (ix = 0;
370 VEC_iterate (info_probe_column_s, headings, ix, column);
371 ++ix)
372 {
6bac7473 373 struct probe *probe;
55aa24fb
SDJ
374 int jx;
375 size_t size_max = strlen (column->print_name);
376
6bac7473 377 for (jx = 0; VEC_iterate (probe_p, probes, jx, probe); ++jx)
55aa24fb
SDJ
378 {
379 /* `probe_fields' refers to the values of each new field that this
380 probe will display. */
381 VEC (const_char_ptr) *probe_fields = NULL;
382 struct cleanup *c2;
383 const char *val;
384 int kx;
385
6bac7473 386 if (probe->pops != p)
55aa24fb
SDJ
387 continue;
388
389 c2 = make_cleanup (VEC_cleanup (const_char_ptr), &probe_fields);
6bac7473 390 p->gen_info_probes_table_values (probe, &probe_fields);
55aa24fb
SDJ
391
392 gdb_assert (VEC_length (const_char_ptr, probe_fields)
393 == headings_size);
394
395 for (kx = 0; VEC_iterate (const_char_ptr, probe_fields, kx, val);
396 ++kx)
397 {
398 /* It is valid to have a NULL value here, which means that the
399 backend does not have something to write and this particular
400 field should be skipped. */
401 if (val == NULL)
402 continue;
403
404 size_max = max (strlen (val), size_max);
405 }
406 do_cleanups (c2);
407 }
408
409 ui_out_table_header (current_uiout, size_max, ui_left,
410 column->field_name, column->print_name);
411 }
412
413 do_cleanups (c);
414}
415
416/* Helper function to print extra information about a probe and an objfile
6bac7473 417 represented by PROBE. */
55aa24fb
SDJ
418
419static void
6bac7473 420print_ui_out_info (struct probe *probe)
55aa24fb
SDJ
421{
422 int ix;
423 int j = 0;
424 /* `values' refers to the actual values of each new field in the output
425 of `info probe'. `headings' refers to the names of each new field. */
426 VEC (const_char_ptr) *values = NULL;
427 VEC (info_probe_column_s) *headings = NULL;
428 info_probe_column_s *column;
429 struct cleanup *c;
430
6bac7473
SDJ
431 gdb_assert (probe != NULL);
432 gdb_assert (probe->pops != NULL);
55aa24fb 433
6bac7473
SDJ
434 if (probe->pops->gen_info_probes_table_header == NULL
435 && probe->pops->gen_info_probes_table_values == NULL)
55aa24fb
SDJ
436 return;
437
6bac7473
SDJ
438 gdb_assert (probe->pops->gen_info_probes_table_header != NULL
439 && probe->pops->gen_info_probes_table_values != NULL);
55aa24fb
SDJ
440
441 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
442 make_cleanup (VEC_cleanup (const_char_ptr), &values);
443
6bac7473
SDJ
444 probe->pops->gen_info_probes_table_header (&headings);
445 probe->pops->gen_info_probes_table_values (probe, &values);
55aa24fb
SDJ
446
447 gdb_assert (VEC_length (info_probe_column_s, headings)
448 == VEC_length (const_char_ptr, values));
449
450 for (ix = 0;
451 VEC_iterate (info_probe_column_s, headings, ix, column);
452 ++ix)
453 {
454 const char *val = VEC_index (const_char_ptr, values, j++);
455
456 if (val == NULL)
457 ui_out_field_skip (current_uiout, column->field_name);
458 else
459 ui_out_field_string (current_uiout, column->field_name, val);
460 }
461
462 do_cleanups (c);
463}
464
465/* Helper function that returns the number of extra fields which POPS will
466 need. */
467
468static int
469get_number_extra_fields (const struct probe_ops *pops)
470{
471 VEC (info_probe_column_s) *headings = NULL;
472 struct cleanup *c;
473 int n;
474
475 if (pops->gen_info_probes_table_header == NULL)
476 return 0;
477
478 c = make_cleanup (VEC_cleanup (info_probe_column_s), &headings);
479 pops->gen_info_probes_table_header (&headings);
480
481 n = VEC_length (info_probe_column_s, headings);
482
483 do_cleanups (c);
484
485 return n;
486}
487
488/* See comment in probe.h. */
489
490void
491info_probes_for_ops (char *arg, int from_tty, const struct probe_ops *pops)
492{
6bac7473 493 char *provider, *probe_name = NULL, *objname = NULL;
55aa24fb 494 struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
6bac7473 495 VEC (probe_p) *probes;
55aa24fb
SDJ
496 int i, any_found;
497 int ui_out_extra_fields = 0;
498 size_t size_addr;
499 size_t size_name = strlen ("Name");
500 size_t size_objname = strlen ("Object");
501 size_t size_provider = strlen ("Provider");
6bac7473 502 struct probe *probe;
55aa24fb
SDJ
503 struct gdbarch *gdbarch = get_current_arch ();
504
505 /* Do we have a `provider:probe:objfile' style of linespec? */
506 provider = extract_arg (&arg);
507 if (provider)
508 {
509 make_cleanup (xfree, provider);
510
6bac7473
SDJ
511 probe_name = extract_arg (&arg);
512 if (probe_name)
55aa24fb 513 {
6bac7473 514 make_cleanup (xfree, probe_name);
55aa24fb
SDJ
515
516 objname = extract_arg (&arg);
517 if (objname)
518 make_cleanup (xfree, objname);
519 }
520 }
521
522 if (pops == NULL)
523 {
524 const struct probe_ops *po;
525 int ix;
526
527 /* If the probe_ops is NULL, it means the user has requested a "simple"
528 `info probes', i.e., she wants to print all information about all
529 probes. For that, we have to identify how many extra fields we will
530 need to add in the ui_out table.
531
532 To do that, we iterate over all probe_ops, querying each one about
533 its extra fields, and incrementing `ui_out_extra_fields' to reflect
534 that number. */
535
536 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
537 ui_out_extra_fields += get_number_extra_fields (po);
538 }
539 else
540 ui_out_extra_fields = get_number_extra_fields (pops);
541
6bac7473
SDJ
542 probes = collect_probes (objname, provider, probe_name, pops);
543 make_cleanup (VEC_cleanup (probe_p), &probes);
55aa24fb
SDJ
544 make_cleanup_ui_out_table_begin_end (current_uiout,
545 4 + ui_out_extra_fields,
6bac7473 546 VEC_length (probe_p, probes),
55aa24fb
SDJ
547 "StaticProbes");
548
6bac7473
SDJ
549 if (!VEC_empty (probe_p, probes))
550 qsort (VEC_address (probe_p, probes), VEC_length (probe_p, probes),
551 sizeof (probe_p), compare_probes);
55aa24fb
SDJ
552
553 /* What's the size of an address in our architecture? */
554 size_addr = gdbarch_addr_bit (gdbarch) == 64 ? 18 : 10;
555
556 /* Determining the maximum size of each field (`provider', `name' and
557 `objname'). */
6bac7473 558 for (i = 0; VEC_iterate (probe_p, probes, i, probe); ++i)
55aa24fb 559 {
6bac7473
SDJ
560 size_name = max (strlen (probe->name), size_name);
561 size_provider = max (strlen (probe->provider), size_provider);
562 size_objname = max (strlen (probe->objfile->name), size_objname);
55aa24fb
SDJ
563 }
564
565 ui_out_table_header (current_uiout, size_provider, ui_left, "provider",
566 _("Provider"));
567 ui_out_table_header (current_uiout, size_name, ui_left, "name", _("Name"));
568 ui_out_table_header (current_uiout, size_addr, ui_left, "addr", _("Where"));
569
570 if (pops == NULL)
571 {
572 const struct probe_ops *po;
573 int ix;
574
575 /* We have to generate the table header for each new probe type that we
576 will print. */
577 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po); ++ix)
6bac7473 578 gen_ui_out_table_header_info (probes, po);
55aa24fb
SDJ
579 }
580 else
6bac7473 581 gen_ui_out_table_header_info (probes, pops);
55aa24fb
SDJ
582
583 ui_out_table_header (current_uiout, size_objname, ui_left, "object",
584 _("Object"));
585 ui_out_table_body (current_uiout);
586
6bac7473 587 for (i = 0; VEC_iterate (probe_p, probes, i, probe); ++i)
55aa24fb
SDJ
588 {
589 struct cleanup *inner;
590
591 inner = make_cleanup_ui_out_tuple_begin_end (current_uiout, "probe");
592
6bac7473
SDJ
593 ui_out_field_string (current_uiout, "provider", probe->provider);
594 ui_out_field_string (current_uiout, "name", probe->name);
55aa24fb 595 ui_out_field_core_addr (current_uiout, "addr",
6bac7473
SDJ
596 get_objfile_arch (probe->objfile),
597 probe->address);
55aa24fb
SDJ
598
599 if (pops == NULL)
600 {
601 const struct probe_ops *po;
602 int ix;
603
604 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, po);
605 ++ix)
6bac7473
SDJ
606 if (probe->pops == po)
607 print_ui_out_info (probe);
55aa24fb
SDJ
608 }
609 else
6bac7473 610 print_ui_out_info (probe);
55aa24fb 611
6bac7473 612 ui_out_field_string (current_uiout, "object", probe->objfile->name);
55aa24fb
SDJ
613 ui_out_text (current_uiout, "\n");
614
615 do_cleanups (inner);
616 }
617
6bac7473 618 any_found = !VEC_empty (probe_p, probes);
55aa24fb
SDJ
619 do_cleanups (cleanup);
620
621 if (!any_found)
622 ui_out_message (current_uiout, 0, _("No probes matched.\n"));
623}
624
625/* Implementation of the `info probes' command. */
626
627static void
628info_probes_command (char *arg, int from_tty)
629{
630 info_probes_for_ops (arg, from_tty, NULL);
631}
632
633/* See comments in probe.h. */
634
635struct value *
636probe_safe_evaluate_at_pc (struct frame_info *frame, unsigned n)
637{
638 struct probe *probe;
6bac7473 639 const struct sym_probe_fns *probe_fns;
2b963b68 640 unsigned n_args;
55aa24fb 641
6bac7473 642 probe = find_probe_by_pc (get_frame_pc (frame));
55aa24fb
SDJ
643 if (!probe)
644 return NULL;
55aa24fb 645
6bac7473
SDJ
646 gdb_assert (probe->objfile != NULL);
647 gdb_assert (probe->objfile->sf != NULL);
648 gdb_assert (probe->objfile->sf->sym_probe_fns != NULL);
649
650 probe_fns = probe->objfile->sf->sym_probe_fns;
2b963b68 651 n_args = probe_fns->sym_get_probe_argument_count (probe);
6bac7473 652
2b963b68 653 if (n >= n_args)
55aa24fb
SDJ
654 return NULL;
655
6bac7473 656 return probe_fns->sym_evaluate_probe_argument (probe, n);
55aa24fb
SDJ
657}
658
659/* See comment in probe.h. */
660
661const struct probe_ops *
662probe_linespec_to_ops (const char **linespecp)
663{
664 int ix;
665 const struct probe_ops *probe_ops;
666
667 for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++)
668 if (probe_ops->is_linespec (linespecp))
669 return probe_ops;
670
671 return NULL;
672}
673
674/* See comment in probe.h. */
675
676int
677probe_is_linespec_by_keyword (const char **linespecp, const char *const *keywords)
678{
679 const char *s = *linespecp;
680 const char *const *csp;
681
682 for (csp = keywords; *csp; csp++)
683 {
684 const char *keyword = *csp;
685 size_t len = strlen (keyword);
686
687 if (strncmp (s, keyword, len) == 0 && isspace (s[len]))
688 {
689 *linespecp += len + 1;
690 return 1;
691 }
692 }
693
694 return 0;
695}
696
697/* Implementation of `is_linespec' method for `struct probe_ops'. */
698
699static int
700probe_any_is_linespec (const char **linespecp)
701{
702 static const char *const keywords[] = { "-p", "-probe", NULL };
703
704 return probe_is_linespec_by_keyword (linespecp, keywords);
705}
706
707/* Dummy method used for `probe_ops_any'. */
708
709static void
710probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
711{
712 /* No probes can be provided by this dummy backend. */
713}
714
715/* Operations associated with a generic probe. */
716
717const struct probe_ops probe_ops_any =
718{
719 probe_any_is_linespec,
720 probe_any_get_probes,
721};
722
723/* See comments in probe.h. */
724
725struct cmd_list_element **
726info_probes_cmdlist_get (void)
727{
728 static struct cmd_list_element *info_probes_cmdlist;
729
730 if (info_probes_cmdlist == NULL)
731 add_prefix_cmd ("probes", class_info, info_probes_command,
732 _("\
733Show available static probes.\n\
734Usage: info probes [all|TYPE [ARGS]]\n\
735TYPE specifies the type of the probe, and can be one of the following:\n\
736 - stap\n\
737If you specify TYPE, there may be additional arguments needed by the\n\
738subcommand.\n\
739If you do not specify any argument, or specify `all', then the command\n\
740will show information about all types of probes."),
741 &info_probes_cmdlist, "info probes ",
742 0/*allow-unknown*/, &infolist);
743
744 return &info_probes_cmdlist;
745}
746
747VEC (probe_ops_cp) *all_probe_ops;
748
749void _initialize_probe (void);
750
751void
752_initialize_probe (void)
753{
754 VEC_safe_push (probe_ops_cp, all_probe_ops, &probe_ops_any);
755
756 add_cmd ("all", class_info, info_probes_command,
757 _("\
758Show information about all type of probes."),
759 info_probes_cmdlist_get ());
760}
This page took 0.160746 seconds and 4 git commands to generate.