On 10/16/2011 7:01 AM, Ken Brown wrote:
gdb 7.3.50-2 crashes with a segfault if a file is loaded and the
following two command lines are sent:

server interpreter mi "-file-list-exec-source-files"
server list

I don't know if it helps, but I've modified the STC from http://cygwin.com/ml/cygwin/2011-10/msg00472.html to apply to the present problem. I had to uncomment the sleep (1) to get it to run properly on my Linux system. I also made the STC run "gdb --annotate=3" even though the crash occurs with just "gdb", because that's how gdb is run by emacs in the situation that led to this bug report.

The STC assumes that you have hello.exe in the current directory.

$ cat > hello.c << EOF
#include <stdio.h>

int
main ()
{
 printf("Hello, world!\n");
 return 0;
}
EOF

$ gcc -g -o hello hello.c

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];
      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++] = "--annotate=3";
      av[i++] = "hello.exe";
      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++] = "server interpreter mi \"-file-list-exec-source-files\"\n";
  input[i++] = "server 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

Reply via email to