On 5/31/2016 5:41 AM, Corinna Vinschen wrote:
Any chance you could bisect Cygwin to help finding the culprit?
The culprit is commit 252a07b0ad3353abcd0fcd9b1b65ff977acd679e Author: Takashi Yano <takashi.y...@nifty.ne.jp> Date: Fri Apr 3 13:07:35 2015 +0900 Cygwin hangs up if several keys are typed during outputting a lot of texts. * fhandler_tty.cc (fhandler_pty_slave::read): Change calculation of "readlen" not to use "bytes_in_pipe" value directly. Reverting that commit fixes the problem. To test, compile and run the attached file. $ gcc gdbstc.cc $ ./a 1-inferior-tty-set /dev/pty3 2-gdb-set height 0 3-gdb-set non-stop 1 4-file-list-exec-source-files 5-file-list-exec-source-file 6-gdb-show prompt 7-stack-info-frame 8-thread-info 9-break-list q *** using gdb =thread-group-added,id="i1" ~"GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1\n" ~"Copyright (C) 2015 Free Software Foundation, Inc.\n" ~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law. Type \"show copying\"\nand \"show warranty\" for details.\n" ~"This GDB was configured as \"i686-pc-cygwin\".\nType \"show configuration\" for configuration details." ~"\nFor bug reporting instructions, please see:\n" ~"<http://www.gnu.org/software/gdb/bugs/>.\n" ~"Find the GDB manual and other documentation resources online at:\n<http://www.gnu.org/software/gdb/documentation/>.\n" ~"For help, type \"help\".\n" ~"Type \"apropos word\" to search for commands related to \"word\".\n" =cmd-param-changed,param="auto-load safe-path",value="/" (gdb) ... In bad cases (bug present), the program hangs and doesn't complete until the gdb process is killed from a different terminal. In good cases it runs to completion. 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