This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Bug in mi_execute_command (mi-main.c)
- From: Nick Roberts <nickrob at gnu dot org>
- To: gdb at sources dot redhat dot com
- Date: Wed, 30 Jun 2004 21:38:17 +0100
- Subject: Bug in mi_execute_command (mi-main.c)
args.action appears to be used without being set by
captured_mi_execute_command in mi-main.c. When I run gdb in Emacs now it picks
up a value of 1 (EXECUTE_COMMAND_SUPRESS_PROMPT) from tcgetattr (presumably
from the stack).
Hardware watchpoint 4: *3221221764
Old value = 16
New value = 1
0x402259fa in tcgetattr () from /lib/libc.so.6
(top-gdb)
Continuing.
Breakpoint 3, mi_execute_command (cmd=0x8467058 "", from_tty=1)
at mi/mi-main.c:1148
(top-gdb)
This value means that the
procedure returns prematurely and the last part of the message is not printed
e.g.
^error,msg="Function \"MAIN__\" not defined."
(gdb)
so Emacs doesn't know that gdb is ready for input.
If I set TERM to xterm instead of dumb or if I run gdb in an xterm args.action
is set to 5 in tcgetattr and there is no problem. However if it is not being
set then it should be initialised to a safe value. This problem did not exist
before 17 May 2004 so perhaps the bug is elsewhere i.e args.action should get
set.
Nick
void
mi_execute_command (char *cmd, int from_tty)
{
struct mi_parse *command;
struct captured_mi_execute_command_args args;
struct ui_out *saved_uiout = uiout;
int result;
/* This is to handle EOF (^D). We just quit gdb. */
/* FIXME: we should call some API function here. */
if (cmd == 0)
quit_force (NULL, from_tty);
command = mi_parse (cmd);
if (command != NULL)
{
/* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either
be pushed even further down or even eliminated? */
args.command = command;
result = catch_exceptions (uiout, captured_mi_execute_command, &args, "",
RETURN_MASK_ALL);
if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT)
{
/* The command is executing synchronously. Bail out early
suppressing the finished prompt. */
mi_parse_free (command);
return;
}
if (args.action == EXECUTE_COMMAND_DISPLAY_ERROR || result < 0)
{
char *msg = error_last_message ();
struct cleanup *cleanup = make_cleanup (xfree, msg);
/* The command execution failed and error() was called
somewhere */
fputs_unfiltered (command->token, raw_stdout);
fputs_unfiltered ("^error,msg=\"", raw_stdout);
fputstr_unfiltered (msg, '"', raw_stdout);
fputs_unfiltered ("\"\n", raw_stdout);
}
mi_parse_free (command);
}
...