[BUG:MI] -break-list doesn't list multiple breakpoints

Nick Roberts
2008-01-10T22:08:26Z

I have previously mentioned this in

http://sourceware.org/ml/gdb-patches/2007-11/msg00276.html

breakpoint.c currently has:

if (b->loc
&& (b->loc->next || !b->loc->enabled))
&& !ui_out_is_mi_like_p (uiout))
{
struct bp_location *loc;
int n = 1;
for (loc = b->loc; loc; loc = loc->next, ++n)
print_one_breakpoint_location (b, loc, n, last_addr);
}

where presumably the !ui_out_is_mi_like_p (uiout) bit is there because the
testsuite failed without it, i.e., so that -break-insert only reports one
breakpoint (the CLI command "break" doesn't use print_one_breakpoint_location).

Unfortunately -break-list also uses print_one_breakpoint_location which means
for a template function used with int and float you get something like:

(gdb)
-break-list
^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="4",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",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="<MULTIPLE>",times="0"}]}

instead of:

(gdb)
-break-list
^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="4",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",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="<MULTIPLE>",times="0"},bkpt={number="1.1",type="",disp="",enabled="y",addr="0x08048776",func="int minimum<int>(int, int)",file="template.cc",fullname="/home/nickrob/C++/template.cc",line="11"},bkpt={number="1.2",type="",disp="",enabled="y",addr="0x0804879f",func="float minimum<float>(float, float)",file="template.cc",fullname="/home/nickrob/C++/template.cc",line="11"}]}

So there is currently no way in MI to see these extra breakpoint locations.

While it will take a long time to fully migrate Emacs to MI, I can certainly
start reducing the dependency on CLI commands like "info break" now. But
only if they have full functionality.

On a more general note, in Emacs, I just just use "info break" after every user
command and will probably just use "-break-list" in the future. I won't use
the output of -break-insert, although some front end might be clever enough to
do this and that presumably was the intention when the command was written.
In that case it might be necessary to include all the locations in a multiple
breakpoint in the output.

Support for CLI in frontends can only be dropped after MI is fully
functional, it makes no sense to to do it before.