On 10/23/2011 5:47 PM, Ken Brown wrote:
On 10/23/2011 3:04 PM, Christopher Faylor wrote:
On Sat, Oct 22, 2011 at 04:37:55PM -0400, Ken Brown wrote:
The attached testcase illustrates a problem with `gdb -i=mi'. I've
tested both gdb 7.3.50-1 and 7.3.50-2, with cygwin 1.7.9 as well as with
several recent snapshots (including 2011-10-22).
Under some circumstances, if gdb -i=mi is started and given several
input lines at once, it only prints part of the output before stopping.
I've been able to reproduce this once in a while while working
interactively (by copying and pasting the whole bunch of input lines);
in this case one can press Return to get the rest of the output. But
the problem happens consistently with the attached test case, which runs
gdb in a subprocess. One has to kill the gdb process before the main
program exits.
The STC runs as expected on Linux.
Thanks for the STC. I had to tweak it to actually see how it was supposed
to work on Linux since only a limited number of lines from the pty were
being output. I've included the revised test case below.
I made a simple change to Cygwin which will probably cause subtle
problems somewhere down the line. At least for now it seems to make gdb
operate as expected.
I'm building a new snapshot now.
Thanks, that fixes it (as well as the emacs problem that originally led
to this report). In case there are emacs users wondering what this is
about, I've been testing emacs-24, which uses gdb -i=mi instead of the
obsolete gdb --annotate=3 used by emacs-23.
I'm replying to this old thread because the problem is back again in
cygwin-1.7.14-2. I haven't checked to see exactly when it first
reappeared (but I'll do this if it would help.) The same STC as before
exhibits the problem; I'm attaching it for convenience.
Ken
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <string.h>
#include <sys/wait.h>
void get_output (int fd);
int
main (int argc, const char **argv)
{
int master;
pid_t pid;
if ((pid = forkpty (&master, NULL, NULL, NULL)) < 0)
{
perror ("forkpty");
exit (1);
}
/* child */
if (pid == 0)
{
const char *av[100];
// putenv ("HOME=/tmp");
int i = 0;
#ifdef STRACE_GDB
av[i++] = "strace";
av[i++] = "-o";
av[i++] = "/tmp/strace.out";
#ifdef __CYGWIN__
av[i++] = "--mask=all+paranoid";
#endif
#endif
av[i++] = argv[1] ?: "gdb";
fprintf (stderr, "*** using %s\n", av[0]);
av[i++] = "-i=mi";
av[i] = NULL;
execvp (av[0], (char * const *) av);
/* shouldn't get here */
exit (1);
}
/* parent */
const char *input[20];
int i = 0;
input[i++] = "1-inferior-tty-set /dev/pty3\n";
input[i++] = "2-gdb-set height 0\n";
input[i++] = "3-gdb-set non-stop 1\n";
input[i++] = "4-file-list-exec-source-files\n";
input[i++] = "5-file-list-exec-source-file\n";
input[i++] = "6-gdb-show prompt\n";
input[i++] = "7-stack-info-frame\n";
input[i++] = "8-thread-info\n";
input[i++] = "9-break-list\n";
input[i++] = "q\n";
input[i] = NULL;
for (int i = 0; input[i]; ++i)
{
write (master, input[i], strlen (input[i]));
// sleep (1);
}
get_output (master);
wait (NULL);
}
void
get_output (int fd)
{
char buf[4096];
while (1)
{
int nread = read (fd, buf, sizeof (buf));
if (nread > 0)
write (STDOUT_FILENO, buf, nread);
else
{
printf ("No more output. nread %d\n", nread);
break;
}
}
}
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple