public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
From: Ken Brown <kbrown@cornell.edu>
To: cygwin@cygwin.com
Subject: Re: gdb pty problem [Was: emacs gud-interface is not updated after gdb command execution (maybe because of incomplete output from gdb)]
Date: Tue, 31 May 2016 09:35:00 -0000	[thread overview]
Message-ID: <a50d8bef-cc9b-3b35-8812-b26360591662@cornell.edu> (raw)
In-Reply-To: <e29d08b0-aaed-46ea-a4eb-960b1e462692@cornell.edu>

[-- Attachment #1: Type: text/plain, Size: 2149 bytes --]

On 5/30/2016 4:02 PM, Ken Brown wrote:
> On 5/26/2016 8:31 AM, Ken Brown wrote:
>> This looks like a bug I reported several years ago; it actually has
>> nothing to do with emacs:
>>
>>   https://www.cygwin.com/ml/cygwin/2011-10/msg00445.html
>>
>> It was fixed but then reappeared some months later:
>>
>>   https://www.cygwin.com/ml/cygwin/2012-05/msg00049.html
>>
>> It was fixed again but apparently is back.  The test case from the
>> original report still exhibits the problem.
>
> I've tracked down the commits that fixed this bug in the past.  The first fix was
>
> commit 31d2bedc585420092eb53895c5f5646651f13215
> Author: Christopher Faylor <me@cgf.cx>
> Date:   Sun Oct 23 19:01:47 2011 +0000
>
>     * fhandler_tty.cc (fhandler_pty_slave::read): Use consistent way for testing
>     ReadFile return.
>     * pipe.cc (fhandler_pipe::create_selectable): Open the write side of the pipe
>     in message-mode to force writing as "chunks".  Explain why.
>
> The second was
>
> commit fb9d631817cc2b5d83c2a6ff928851d201c992bf
> Author: Christopher Faylor <me@cgf.cx>
> Date:   Fri May 4 03:00:43 2012 +0000
>
>     * DevNotes: Add entry cgf-000002.
>     * fhandler_tty.cc (bytes_available): Revert to previous Oct-2011 behavior where
>     a dummy buffer is used to determine how many bytes will be read.
>     (fhandler_pty_master::ioctl): Correct coercion in assignment.
>
> A few weeks later the code was simplified:
>
> commit bd8afa5eb160b56715b805befe850a5ba2131d28
> Author: Christopher Faylor <me@cgf.cx>
> Date:   Wed May 16 01:56:41 2012 +0000
>
>     * DevNotes: Add entry cgf-000008.
>     * fhandler_tty.cc (bytes_available): Simplify by returning the number of bytes
>     available in the message unless that is zero.
>
> I've looked at the current code in the vicinity of these changes, and nothing jumps out at me as obviously breaking the previous fixes; but that doesn't mean much.

FWIW, if I take my original test case, as modified by cgf, and uncomment 
the line "sleep (1);", then the program finishes successfully.  I don't 
know if that provides a clue.

For convenience, I'm attaching the modified test case.

Ken


[-- Attachment #2: gdbstc.cc --]
[-- Type: text/plain, Size: 1712 bytes --]

#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;
	}
    }
}




[-- Attachment #3: Type: text/plain, Size: 218 bytes --]

--
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

  reply	other threads:[~2016-05-30 22:41 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-26 12:32 emacs gud-interface is not updated after gdb command execution (maybe because of incomplete output from gdb) Tobias Zawada
2016-05-26 15:48 ` William M. (Mike) Miller
2016-05-26 17:48 ` Ken Brown
2016-05-26 18:00   ` Tobias Zawada
2016-05-26 18:01     ` Ken Brown
2016-05-31  1:47   ` gdb pty problem [Was: emacs gud-interface is not updated after gdb command execution (maybe because of incomplete output from gdb)] Ken Brown
2016-05-31  9:35     ` Ken Brown [this message]
2016-05-31 22:41       ` Corinna Vinschen
2016-06-01 12:51         ` Ken Brown
2016-06-01 13:02           ` Ken Brown
2016-06-01 14:28             ` Corinna Vinschen
2016-06-01 14:29               ` Corinna Vinschen
2016-06-01 14:33               ` Ken Brown
2016-06-01 15:22                 ` Ken Brown
2016-06-01 18:29                   ` Corinna Vinschen
2016-06-01 19:05                     ` Ken Brown
2016-06-01 19:54                       ` Corinna Vinschen
2016-06-01 20:01                         ` Ken Brown
2016-06-01 21:05                           ` [GOLDSTAR] " Corinna Vinschen
2016-06-02  2:09                             ` Andrew Schulman
2016-06-01 14:18           ` Corinna Vinschen
2016-06-06 10:12             ` Takashi Yano
2016-06-06 13:16               ` Corinna Vinschen
2016-06-07 13:14                 ` Takashi Yano
2016-06-07 16:11                   ` Corinna Vinschen
2016-06-06 14:01               ` Ken Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a50d8bef-cc9b-3b35-8812-b26360591662@cornell.edu \
    --to=kbrown@cornell.edu \
    --cc=cygwin@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).