1 /* MI Command Set - breakpoint and watchpoint commands.
2 Copyright (C) 2000-2013 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 "gdb_string.h"
27 #include "mi-getopt.h"
29 #include "exceptions.h"
32 #include "mi-cmd-break.h"
33 #include "gdb_obstack.h"
41 /* True if MI breakpoint observers have been registered. */
43 static int mi_breakpoint_observers_installed
;
45 /* Control whether breakpoint_notify may act. */
47 static int mi_can_breakpoint_notify
;
49 /* Output a single breakpoint, when allowed. */
52 breakpoint_notify (struct breakpoint
*b
)
54 if (mi_can_breakpoint_notify
)
55 gdb_breakpoint_query (current_uiout
, b
->number
, NULL
);
65 /* Arrange for all new breakpoints and catchpoints to be reported to
66 CURRENT_UIOUT until the cleanup returned by this function is run.
68 Note that MI output will be probably invalid if more than one
69 breakpoint is created inside one MI command. */
72 setup_breakpoint_reporting (void)
74 struct cleanup
*rev_flag
;
76 if (! mi_breakpoint_observers_installed
)
78 observer_attach_breakpoint_created (breakpoint_notify
);
79 mi_breakpoint_observers_installed
= 1;
82 rev_flag
= make_cleanup_restore_integer (&mi_can_breakpoint_notify
);
83 mi_can_breakpoint_notify
= 1;
89 /* Convert arguments in ARGV to the string in "format",argv,argv...
93 mi_argv_to_format (char **argv
, int argc
)
96 struct obstack obstack
;
99 obstack_init (&obstack
);
101 /* Convert ARGV[OIND + 1] to format string and save to FORMAT. */
102 obstack_1grow (&obstack
, '\"');
103 for (i
= 0; i
< strlen (argv
[0]); i
++)
108 obstack_grow (&obstack
, "\\\\", 2);
111 obstack_grow (&obstack
, "\\a", 2);
114 obstack_grow (&obstack
, "\\b", 2);
117 obstack_grow (&obstack
, "\\f", 2);
120 obstack_grow (&obstack
, "\\n", 2);
123 obstack_grow (&obstack
, "\\r", 2);
126 obstack_grow (&obstack
, "\\t", 2);
129 obstack_grow (&obstack
, "\\v", 2);
132 if (isprint (argv
[0][i
]))
133 obstack_grow (&obstack
, argv
[0] + i
, 1);
138 sprintf (tmp
, "\\%o", (unsigned char) argv
[0][i
]);
139 obstack_grow (&obstack
, tmp
, strlen (tmp
));
144 obstack_1grow (&obstack
, '\"');
146 /* Apply other argv to FORMAT. */
147 for (i
= 1; i
< argc
; i
++)
149 obstack_1grow (&obstack
, ',');
150 obstack_grow (&obstack
, argv
[i
], strlen (argv
[i
]));
152 obstack_1grow (&obstack
, '\0');
154 ret
= xstrdup (obstack_finish (&obstack
));
155 obstack_free (&obstack
, NULL
);
160 /* Insert breakpoint.
161 If dprintf is true, it will insert dprintf.
162 If not, it will insert other type breakpoint. */
165 mi_cmd_break_insert_1 (int dprintf
, char *command
, char **argv
, int argc
)
167 char *address
= NULL
;
171 int ignore_count
= 0;
172 char *condition
= NULL
;
176 struct cleanup
*back_to
= make_cleanup (null_cleanup
, NULL
);
177 enum bptype type_wanted
;
178 struct breakpoint_ops
*ops
;
179 char *extra_string
= NULL
;
183 HARDWARE_OPT
, TEMP_OPT
, CONDITION_OPT
,
184 IGNORE_COUNT_OPT
, THREAD_OPT
, PENDING_OPT
, DISABLE_OPT
,
187 static const struct mi_opt opts
[] =
189 {"h", HARDWARE_OPT
, 0},
191 {"c", CONDITION_OPT
, 1},
192 {"i", IGNORE_COUNT_OPT
, 1},
193 {"p", THREAD_OPT
, 1},
194 {"f", PENDING_OPT
, 0},
195 {"d", DISABLE_OPT
, 0},
196 {"a", TRACEPOINT_OPT
, 0},
200 /* Parse arguments. It could be -r or -h or -t, <location> or ``--''
201 to denote the end of the option list. */
207 int opt
= mi_getopt ("-break-insert", argc
, argv
,
211 switch ((enum opt
) opt
)
222 case IGNORE_COUNT_OPT
:
223 ignore_count
= atol (oarg
);
226 thread
= atol (oarg
);
241 error (_("-%s-insert: Missing <location>"),
242 dprintf
? "dprintf" : "break");
243 address
= argv
[oind
];
246 int format_num
= oind
+ 1;
248 if (hardware
|| tracepoint
)
249 error (_("-dprintf-insert: does not support -h or -a"));
250 if (format_num
>= argc
)
251 error (_("-dprintf-insert: Missing <format>"));
253 extra_string
= mi_argv_to_format (argv
+ format_num
, argc
- format_num
);
254 make_cleanup (xfree
, extra_string
);
259 error (_("-break-insert: Garbage following <location>"));
262 /* Now we have what we need, let's insert the breakpoint! */
263 setup_breakpoint_reporting ();
267 /* Note that to request a fast tracepoint, the client uses the
268 "hardware" flag, although there's nothing of hardware related to
269 fast tracepoints -- one can implement slow tracepoints with
270 hardware breakpoints, but fast tracepoints are always software.
271 "fast" is a misnomer, actually, "jump" would be more appropriate.
272 A simulator or an emulator could conceivably implement fast
273 regular non-jump based tracepoints. */
274 type_wanted
= hardware
? bp_fast_tracepoint
: bp_tracepoint
;
275 ops
= &tracepoint_breakpoint_ops
;
279 type_wanted
= bp_dprintf
;
280 ops
= &dprintf_breakpoint_ops
;
284 type_wanted
= hardware
? bp_hardware_breakpoint
: bp_breakpoint
;
285 ops
= &bkpt_breakpoint_ops
;
288 create_breakpoint (get_current_arch (), address
, condition
, thread
,
290 0 /* condition and thread are valid. */,
293 pending
? AUTO_BOOLEAN_TRUE
: AUTO_BOOLEAN_FALSE
,
294 ops
, 0, enabled
, 0, 0);
295 do_cleanups (back_to
);
298 /* Implements the -break-insert command.
299 See the MI manual for the list of possible options. */
302 mi_cmd_break_insert (char *command
, char **argv
, int argc
)
304 mi_cmd_break_insert_1 (0, command
, argv
, argc
);
307 /* Implements the -dprintf-insert command.
308 See the MI manual for the list of possible options. */
311 mi_cmd_dprintf_insert (char *command
, char **argv
, int argc
)
313 mi_cmd_break_insert_1 (1, command
, argv
, argc
);
324 mi_cmd_break_passcount (char *command
, char **argv
, int argc
)
328 struct tracepoint
*t
;
331 error (_("Usage: tracepoint-number passcount"));
335 t
= get_tracepoint (n
);
340 observer_notify_breakpoint_modified (&t
->base
);
344 error (_("Could not find tracepoint %d"), n
);
348 /* Insert a watchpoint. The type of watchpoint is specified by the
350 -break-watch <expr> --> insert a regular wp.
351 -break-watch -r <expr> --> insert a read watchpoint.
352 -break-watch -a <expr> --> insert an access wp. */
355 mi_cmd_break_watch (char *command
, char **argv
, int argc
)
358 enum wp_type type
= REG_WP
;
363 static const struct mi_opt opts
[] =
366 {"a", ACCESS_OPT
, 0},
370 /* Parse arguments. */
376 int opt
= mi_getopt ("-break-watch", argc
, argv
,
381 switch ((enum opt
) opt
)
392 error (_("-break-watch: Missing <expression>"));
394 error (_("-break-watch: Garbage following <expression>"));
397 /* Now we have what we need, let's insert the watchpoint! */
401 watch_command_wrapper (expr
, FROM_TTY
, 0);
404 rwatch_command_wrapper (expr
, FROM_TTY
, 0);
407 awatch_command_wrapper (expr
, FROM_TTY
, 0);
410 error (_("-break-watch: Unknown watchpoint type."));
414 /* The mi_read_next_line consults these variable to return successive
415 command lines. While it would be clearer to use a closure pointer,
416 it is not expected that any future code will use read_command_lines_1,
417 therefore no point of overengineering. */
419 static char **mi_command_line_array
;
420 static int mi_command_line_array_cnt
;
421 static int mi_command_line_array_ptr
;
424 mi_read_next_line (void)
426 if (mi_command_line_array_ptr
== mi_command_line_array_cnt
)
429 return mi_command_line_array
[mi_command_line_array_ptr
++];
433 mi_cmd_break_commands (char *command
, char **argv
, int argc
)
435 struct command_line
*break_command
;
438 struct breakpoint
*b
;
441 error (_("USAGE: %s <BKPT> [<COMMAND> [<COMMAND>...]]"), command
);
443 bnum
= strtol (argv
[0], &endptr
, 0);
444 if (endptr
== argv
[0])
445 error (_("breakpoint number argument \"%s\" is not a number."),
447 else if (*endptr
!= '\0')
448 error (_("junk at the end of breakpoint number argument \"%s\"."),
451 b
= get_breakpoint (bnum
);
453 error (_("breakpoint %d not found."), bnum
);
455 mi_command_line_array
= argv
;
456 mi_command_line_array_ptr
= 1;
457 mi_command_line_array_cnt
= argc
;
459 if (is_tracepoint (b
))
460 break_command
= read_command_lines_1 (mi_read_next_line
, 1,
461 check_tracepoint_command
, b
);
463 break_command
= read_command_lines_1 (mi_read_next_line
, 1, 0, 0);
465 breakpoint_set_commands (b
, break_command
);