mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 10:35:12 +08:00
9db0d8536d
The "script" field, output whenever information about a breakpoint with
commands is output, uses wrong MI syntax.
$ ./gdb -nx -q --data-directory=data-directory -x script -i mi
=thread-group-added,id="i1"
=breakpoint-created,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",original-location="main"}
=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",script={"aaa","bbb","ccc"},original-location="main"}
(gdb)
-break-info
^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="18",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",script={"aaa","bbb","ccc"},original-location="main"}]}
(gdb)
In both the =breakpoint-modified and -break-info output, we have:
script={"aaa","bbb","ccc"}
According to the output syntax [1], curly braces means tuple, and a
tuple contains key=value pairs. This looks like it should be a list,
but uses curly braces by mistake. This would make more sense:
script=["aaa","bbb","ccc"]
Fix it, keeping the backwards compatibility by introducing a new MI
version (MI4), in exactly the same way as was done when fixing
multi-locations breakpoint output in [2].
- Add a fix_breakpoint_script_output uiout flag. MI uiouts will use
this flag if the version is >= 4.
- Add a fix_breakpoint_script_output_globally variable and the
-fix-breakpoint-script-output MI command to set it, if frontends want
to use the fixed output for this without using the newer MI version.
- When emitting the script field, use list instead of tuple, if we want
the fixed output (depending on the two criteria above)
-
[1] https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Syntax.html#GDB_002fMI-Output-Syntax
[2] b4be1b0648
Change-Id: I7113c6892832c8d6805badb06ce42496677e2242
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24285
80 lines
2.6 KiB
C
80 lines
2.6 KiB
C
/* MI Internal Functions for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2003-2022 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef MI_MI_MAIN_H
|
|
#define MI_MI_MAIN_H
|
|
|
|
struct ui_file;
|
|
|
|
extern void mi_load_progress (const char *section_name,
|
|
unsigned long sent_so_far,
|
|
unsigned long total_section,
|
|
unsigned long total_sent,
|
|
unsigned long grand_total);
|
|
|
|
extern void mi_print_timing_maybe (struct ui_file *file);
|
|
|
|
/* Whether MI is in async mode. */
|
|
|
|
extern int mi_async_p (void);
|
|
|
|
extern char *current_token;
|
|
|
|
extern int running_result_record_printed;
|
|
extern int mi_proceeded;
|
|
|
|
struct mi_suppress_notification
|
|
{
|
|
/* Breakpoint notification suppressed? */
|
|
int breakpoint;
|
|
/* Command param changed notification suppressed? */
|
|
int cmd_param_changed;
|
|
/* Traceframe changed notification suppressed? */
|
|
int traceframe;
|
|
/* Memory changed notification suppressed? */
|
|
int memory;
|
|
/* User selected context changed notification suppressed? */
|
|
int user_selected_context;
|
|
};
|
|
extern struct mi_suppress_notification mi_suppress_notification;
|
|
|
|
/* This is a hack so we can get some extra commands going, but has existed
|
|
within GDB for many years now. Ideally we don't want to channel things
|
|
through the CLI, but implement all commands as pure MI commands with
|
|
their own implementation.
|
|
|
|
Execute the CLI command CMD, if ARGS_P is true then ARGS should be a
|
|
non-nullptr string containing arguments to add after CMD. If ARGS_P is
|
|
false then ARGS must be nullptr. */
|
|
|
|
extern void mi_execute_cli_command (const char *cmd, bool args_p,
|
|
const char *args);
|
|
|
|
/* Implementation of -fix-multi-location-breakpoint-output. */
|
|
|
|
extern void mi_cmd_fix_multi_location_breakpoint_output (const char *command,
|
|
char **argv, int argc);
|
|
|
|
/* Implementation of -fix-breakpoint-script-output. */
|
|
|
|
extern void mi_cmd_fix_breakpoint_script_output (const char *command,
|
|
char **argv, int argc);
|
|
|
|
#endif /* MI_MI_MAIN_H */
|