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. cgf
#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