This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: MI problem
- From: Andrew STUBBS <andrew dot stubbs at st dot com>
- To: Daniel Jacobowitz <drow at false dot org>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Thu, 17 Nov 2005 19:17:01 +0000
- Subject: Re: MI problem
- References: <4378DDB4.3020702@st.com> <20051117042008.GE3513@nevyn.them.org>
Daniel Jacobowitz wrote:
The interesting question isn't where it gets switched, but where we're
expecting the wrong contents. If we're accessing uiout.data->buffer
then we must have reached mi_out_put. So where from, and how did we
get there without switching the global uiout back to MI's?
mi_cmd_interpreter_exec ought to be doing that on the way out.
This is the backtrace from the core dump file:
#0 0x0805a220 in ui_file_put (file=0x19, write=0x80863f8 <do_write>,
dest=0xa030f18)
at ../../src/gdb/ui-file.c:192
#1 0x0808642a in mi_out_put (uiout=0xa028b90, stream=0xa030f18)
at ../../src/gdb/mi/mi-out.c:376
#2 0x0808adc9 in mi_load_progress (section_name=0xa11f79f ".init",
sent_so_far=54,
total_section=54, total_sent=54, grand_total=523177) at
../../src/gdb/mi/mi-main.c:1402
#3 0x080c4857 in load_section_callback (abfd=0xa0a5278, asec=0x36,
data=0xbfffb930)
at ../../src/gdb/symfile.c:1597
#4 0x0818c69d in bfd_map_over_sections (abfd=0xa0a5278,
operation=0x80c4670 <load_section_callback>, user_storage=0xbfffb930)
at ../../src/bfd/section.c:1226
#5 0x080c4a17 in generic_load (args=0xbfffb930 "", from_tty=1) at
../../src/gdb/symfile.c:1670
#6 0x080edf1f in target_load (arg=0xa0322b0
"/home/afra/users/stubbsa/os21test-microdev",
from_tty=1) at ../../src/gdb/target.c:268
mi_load_progress is actually called through the function pointer
deprecated_show_load_progress.
The problem appears to be that the program is finding it's way into the
MI through deprecated_show_load_progress when uiout is not set as expected.
The problem only occurs in -i=mi (no number) and -i=mi1 because
mi_load_progress does not do anything in other versions. Strangely -i=mi
is supposed to be the same as -i=mi2, but it isn't in this respect.
I attach a patch which fixes both the crash and the inconsistency. I
have tested it and got no unexpected failures. Of course I doubt the
testsuite covers this feature ...
OK? I would like to see this issued fixed in 6.4 also.
Andrew Stubbs
2005-11-17 Andrew Stubbs <andrew.stubbs@st.com>
* mi/mi-main.c (mi_load_progress): Don't do anything for -i=mi.
Ensure the use of mi1 uiout for the duration of the function.
Index: src/gdb/mi/mi-main.c
===================================================================
--- src.orig/gdb/mi/mi-main.c 2005-06-13 23:21:57.000000000 +0100
+++ src/gdb/mi/mi-main.c 2005-11-17 18:58:45.000000000 +0000
@@ -1365,11 +1365,17 @@ mi_load_progress (const char *section_na
static struct timeval last_update;
static char *previous_sect_name = NULL;
int new_section;
+ struct ui_out *saved_uiout;
- if (!current_interp_named_p (INTERP_MI)
- && !current_interp_named_p (INTERP_MI1))
+ if (!current_interp_named_p (INTERP_MI1))
return;
+ /* This function is called through deprecated_show_load_progress
+ which means uiout may not be correct. Fix it for the duration
+ of this function. */
+ saved_uiout = uiout;
+ uiout = mi_out_new (1);
+
update_threshold.tv_sec = 0;
update_threshold.tv_usec = 500000;
gettimeofday (&time_now, NULL);
@@ -1424,6 +1430,9 @@ mi_load_progress (const char *section_na
fputs_unfiltered ("\n", raw_stdout);
gdb_flush (raw_stdout);
}
+
+ xfree (uiout);
+ uiout = saved_uiout;
}
void