1 /* MI Command Set - breakpoint and watchpoint commands.
2 Copyright (C) 2000-2015 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions (a Red Hat company).
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/>. */
21 #include "arch-utils.h"
25 #include "breakpoint.h"
26 #include "mi-getopt.h"
30 #include "mi-cmd-break.h"
31 #include "gdb_obstack.h"
39 /* True if MI breakpoint observers have been registered. */
41 static int mi_breakpoint_observers_installed
;
43 /* Control whether breakpoint_notify may act. */
45 static int mi_can_breakpoint_notify
;
47 /* Output a single breakpoint, when allowed. */
50 breakpoint_notify (struct breakpoint
*b
)
52 if (mi_can_breakpoint_notify
)
53 gdb_breakpoint_query (current_uiout
, b
->number
, NULL
);
63 /* Arrange for all new breakpoints and catchpoints to be reported to
64 CURRENT_UIOUT until the cleanup returned by this function is run.
66 Note that MI output will be probably invalid if more than one
67 breakpoint is created inside one MI command. */
70 setup_breakpoint_reporting (void)
72 struct cleanup
*rev_flag
;
74 if (! mi_breakpoint_observers_installed
)
76 observer_attach_breakpoint_created (breakpoint_notify
);
77 mi_breakpoint_observers_installed
= 1;
80 rev_flag
= make_cleanup_restore_integer (&mi_can_breakpoint_notify
);
81 mi_can_breakpoint_notify
= 1;
87 /* Convert arguments in ARGV to the string in "format",argv,argv...
91 mi_argv_to_format (char **argv
, int argc
)
94 struct obstack obstack
;
97 obstack_init (&obstack
);
99 /* Convert ARGV[OIND + 1] to format string and save to FORMAT. */
100 obstack_1grow (&obstack
, '\"');
101 for (i
= 0; i
< strlen (argv
[0]); i
++)
106 obstack_grow (&obstack
, "\\\\", 2);
109 obstack_grow (&obstack
, "\\a", 2);
112 obstack_grow (&obstack
, "\\b", 2);
115 obstack_grow (&obstack
, "\\f", 2);
118 obstack_grow (&obstack
, "\\n", 2);
121 obstack_grow (&obstack
, "\\r", 2);
124 obstack_grow (&obstack
, "\\t", 2);
127 obstack_grow (&obstack
, "\\v", 2);
130 obstack_grow (&obstack
, "\\\"", 2);
133 if (isprint (argv
[0][i
]))
134 obstack_grow (&obstack
, argv
[0] + i
, 1);
139 xsnprintf (tmp
, sizeof (tmp
), "\\%o",
140 (unsigned char) argv
[0][i
]);
141 obstack_grow (&obstack
, tmp
, strlen (tmp
));
146 obstack_1grow (&obstack
, '\"');
148 /* Apply other argv to FORMAT. */
149 for (i
= 1; i
< argc
; i
++)
151 obstack_1grow (&obstack
, ',');
152 obstack_grow (&obstack
, argv
[i
], strlen (argv
[i
]));
154 obstack_1grow (&obstack
, '\0');
156 ret
= xstrdup (obstack_finish (&obstack
));
157 obstack_free (&obstack
, NULL
);
162 /* Insert breakpoint.
163 If dprintf is true, it will insert dprintf.
164 If not, it will insert other type breakpoint. */
167 mi_cmd_break_insert_1 (int dprintf
, char *command
, char **argv
, int argc
)
169 char *address
= NULL
;
173 int ignore_count
= 0;
174 char *condition
= NULL
;
178 struct cleanup
*back_to
= make_cleanup (null_cleanup
, NULL
);
179 enum bptype type_wanted
;
180 struct breakpoint_ops
*ops
;
181 char *extra_string
= NULL
;
185 HARDWARE_OPT
, TEMP_OPT
, CONDITION_OPT
,
186 IGNORE_COUNT_OPT
, THREAD_OPT
, PENDING_OPT
, DISABLE_OPT
,
189 static const struct mi_opt opts
[] =
191 {"h", HARDWARE_OPT
, 0},
193 {"c", CONDITION_OPT
, 1},
194 {"i", IGNORE_COUNT_OPT
, 1},
195 {"p", THREAD_OPT
, 1},
196 {"f", PENDING_OPT
, 0},
197 {"d", DISABLE_OPT
, 0},
198 {"a", TRACEPOINT_OPT
, 0},
202 /* Parse arguments. It could be -r or -h or -t, <location> or ``--''
203 to denote the end of the option list. */
209 int opt
= mi_getopt ("-break-insert", argc
, argv
,
213 switch ((enum opt
) opt
)
224 case IGNORE_COUNT_OPT
:
225 ignore_count
= atol (oarg
);
228 thread
= atol (oarg
);
243 error (_("-%s-insert: Missing <location>"),
244 dprintf
? "dprintf" : "break");
245 address
= argv
[oind
];
248 int format_num
= oind
+ 1;
250 if (hardware
|| tracepoint
)
251 error (_("-dprintf-insert: does not support -h or -a"));
252 if (format_num
>= argc
)
253 error (_("-dprintf-insert: Missing <format>"));
255 extra_string
= mi_argv_to_format (argv
+ format_num
, argc
- format_num
);
256 make_cleanup (xfree
, extra_string
);
261 error (_("-break-insert: Garbage following <location>"));
264 /* Now we have what we need, let's insert the breakpoint! */
265 setup_breakpoint_reporting ();
269 /* Note that to request a fast tracepoint, the client uses the
270 "hardware" flag, although there's nothing of hardware related to
271 fast tracepoints -- one can implement slow tracepoints with
272 hardware breakpoints, but fast tracepoints are always software.
273 "fast" is a misnomer, actually, "jump" would be more appropriate.
274 A simulator or an emulator could conceivably implement fast
275 regular non-jump based tracepoints. */
276 type_wanted
= hardware
? bp_fast_tracepoint
: bp_tracepoint
;
277 ops
= &tracepoint_breakpoint_ops
;
281 type_wanted
= bp_dprintf
;
282 ops
= &dprintf_breakpoint_ops
;
286 type_wanted
= hardware
? bp_hardware_breakpoint
: bp_breakpoint
;
287 ops
= &bkpt_breakpoint_ops
;
290 create_breakpoint (get_current_arch (), address
, condition
, thread
,
292 0 /* condition and thread are valid. */,
295 pending
? AUTO_BOOLEAN_TRUE
: AUTO_BOOLEAN_FALSE
,
296 ops
, 0, enabled
, 0, 0);
297 do_cleanups (back_to
);
300 /* Implements the -break-insert command.
301 See the MI manual for the list of possible options. */
304 mi_cmd_break_insert (char *command
, char **argv
, int argc
)
306 mi_cmd_break_insert_1 (0, command
, argv
, argc
);
309 /* Implements the -dprintf-insert command.
310 See the MI manual for the list of possible options. */
313 mi_cmd_dprintf_insert (char *command
, char **argv
, int argc
)
315 mi_cmd_break_insert_1 (1, command
, argv
, argc
);
326 mi_cmd_break_passcount (char *command
, char **argv
, int argc
)
330 struct tracepoint
*t
;
333 error (_("Usage: tracepoint-number passcount"));
337 t
= get_tracepoint (n
);
342 observer_notify_breakpoint_modified (&t
->base
);
346 error (_("Could not find tracepoint %d"), n
);
350 /* Insert a watchpoint. The type of watchpoint is specified by the
352 -break-watch <expr> --> insert a regular wp.
353 -break-watch -r <expr> --> insert a read watchpoint.
354 -break-watch -a <expr> --> insert an access wp. */
357 mi_cmd_break_watch (char *command
, char **argv
, int argc
)
360 enum wp_type type
= REG_WP
;
365 static const struct mi_opt opts
[] =
368 {"a", ACCESS_OPT
, 0},
372 /* Parse arguments. */
378 int opt
= mi_getopt ("-break-watch", argc
, argv
,
383 switch ((enum opt
) opt
)
394 error (_("-break-watch: Missing <expression>"));
396 error (_("-break-watch: Garbage following <expression>"));
399 /* Now we have what we need, let's insert the watchpoint! */
403 watch_command_wrapper (expr
, FROM_TTY
, 0);
406 rwatch_command_wrapper (expr
, FROM_TTY
, 0);
409 awatch_command_wrapper (expr
, FROM_TTY
, 0);
412 error (_("-break-watch: Unknown watchpoint type."));
416 /* The mi_read_next_line consults these variable to return successive
417 command lines. While it would be clearer to use a closure pointer,
418 it is not expected that any future code will use read_command_lines_1,
419 therefore no point of overengineering. */
421 static char **mi_command_line_array
;
422 static int mi_command_line_array_cnt
;
423 static int mi_command_line_array_ptr
;
426 mi_read_next_line (void)
428 if (mi_command_line_array_ptr
== mi_command_line_array_cnt
)
431 return mi_command_line_array
[mi_command_line_array_ptr
++];
435 mi_cmd_break_commands (char *command
, char **argv
, int argc
)
437 struct command_line
*break_command
;
440 struct breakpoint
*b
;
443 error (_("USAGE: %s <BKPT> [<COMMAND> [<COMMAND>...]]"), command
);
445 bnum
= strtol (argv
[0], &endptr
, 0);
446 if (endptr
== argv
[0])
447 error (_("breakpoint number argument \"%s\" is not a number."),
449 else if (*endptr
!= '\0')
450 error (_("junk at the end of breakpoint number argument \"%s\"."),
453 b
= get_breakpoint (bnum
);
455 error (_("breakpoint %d not found."), bnum
);
457 mi_command_line_array
= argv
;
458 mi_command_line_array_ptr
= 1;
459 mi_command_line_array_cnt
= argc
;
461 if (is_tracepoint (b
))
462 break_command
= read_command_lines_1 (mi_read_next_line
, 1,
463 check_tracepoint_command
, b
);
465 break_command
= read_command_lines_1 (mi_read_next_line
, 1, 0, 0);
467 breakpoint_set_commands (b
, break_command
);