public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Florian Weimer <fweimer@redhat.com>
To: Pedro Alves <pedro@palves.net>
Cc: Simon Marchi <simon.marchi@polymtl.ca>,
	 libc-alpha@sourceware.org, gdb-patches@sourceware.org,
	 Emil Velikov <emil.l.velikov@gmail.com>,
	Kevin Buettner <kevinb@redhat.com>
Subject: Re: [PATCH glibc] nptl_db: different libpthread/ld.so load orders (bug 27744)
Date: Mon, 19 Apr 2021 11:06:04 +0200	[thread overview]
Message-ID: <87eef663ur.fsf@oldenburg.str.redhat.com> (raw)
In-Reply-To: <8285fcc7-aabd-48db-d256-1531e7b6f11b@palves.net> (Pedro Alves's message of "Fri, 16 Apr 2021 18:43:53 +0100")

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

* Pedro Alves:

> Even without reducing, it is possible to make the program that triggers the
> assertion be a standalone program?

git clone https://pagure.io/glibc/glibc-support
cd glibc-support
make

Then drop the attached file into the tests subdirectory, and run:

make LDFLAGS=-lpthread
build/tst-pthread-gdb-attach

This should reproduce the issue out side of the glibc tree.

> Any reason you're using "add-symbol-file" in the first place, instead
> of "file"?

The main program is ld.so.

Thanks,
Florian

[-- Attachment #2: tst-pthread-gdb-attach.c --]
[-- Type: text/plain, Size: 4121 bytes --]

/* Smoke testing GDB process attach with thread-local variable access.
   Copyright (C) 2021 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */

/* This test runs GDB against a forked copy of itself, to check
   whether libthread_db can be loaded, and that access to thread-local
   variables works.  */

#include <errno.h>
#include <stdlib.h>
#include <support/check.h>
#include <support/support.h>
#include <support/temp_file.h>
#include <support/test-driver.h>
#include <support/xstdio.h>
#include <support/xthread.h>
#include <support/xunistd.h>
#include <unistd.h>

/* Starts out as zero, changed to 1 or 2 by the debugger, depending on
   the thread.  */
__thread volatile int altered_by_debugger;

/* Writes the GDB script to run the test to PATH.  */
static void
write_gdbscript (const char *path, int tested_pid)
{
  FILE *fp = xfopen (path, "w");
  char *exepath = realpath ("/proc/self/exe", NULL);
  TEST_VERIFY_EXIT (exepath != NULL);
  fprintf (fp,
           "set trace-commands on\n"
           "set debug libthread-db 1\n"
           "add-symbol-file %s\n"
           "attach %d\n",
           exepath, tested_pid);
  fputs ("break debugger_inspection_point\n"
         "continue\n"
         "thread 1\n"
         "print altered_by_debugger\n"
         "print altered_by_debugger = 1\n"
         "thread 2\n"
         "print altered_by_debugger\n"
         "print altered_by_debugger = 2\n"
         "continue\n",
         fp);
  free (exepath);
  xfclose (fp);
}

/* The test sets a breakpoint on this function and alters the
   altered_by_debugger thread-local variable.  */
void __attribute__ ((weak))
debugger_inspection_point (void)
{
}

/* Thread function for the test thread in the subprocess.  */
static void *
subprocess_thread (void *closure)
{
  /* Wait until altered_by_debugger changes the value away from 0.  */
  while (altered_by_debugger == 0)
    {
      usleep (100 * 1000);
      debugger_inspection_point ();
    }

  TEST_COMPARE (altered_by_debugger, 2);
  return NULL;
}

/* This function implements the subprocess under test.  It creates a
   second thread, waiting for its value to change to 2, and checks
   that the main thread also changed its value to 1.  */
static void
in_subprocess (void)
{
  pthread_t thr = xpthread_create (NULL, subprocess_thread, NULL);
  TEST_VERIFY (xpthread_join (thr) == NULL);
  TEST_COMPARE (altered_by_debugger, 1);
  _exit (0);
}

static int
do_test (void)
{
  pid_t tested_pid = xfork ();
  if (tested_pid == 0)
    in_subprocess ();
  char *tested_pid_string = xasprintf ("%d", tested_pid);

  char *gdbscript;
  xclose (create_temp_file ("tst-pthread-gdb-attach-", &gdbscript));
  write_gdbscript (gdbscript, tested_pid);

  pid_t gdb_pid = xfork ();
  if (gdb_pid == 0)
    {
      clearenv ();
      xdup2 (STDOUT_FILENO, STDERR_FILENO);
      execlp ("gdb", "gdb", "-nx", "-batch", "-x", gdbscript, NULL);
      if (errno == ENOENT)
        _exit (EXIT_UNSUPPORTED);
      else
        _exit (1);
    }

  int status;
  TEST_COMPARE (xwaitpid (gdb_pid, &status, 0), gdb_pid);
  if (WIFEXITED (status) && WEXITSTATUS (status) == EXIT_UNSUPPORTED)
    /* gdb is not installed.  */
    return EXIT_UNSUPPORTED;
  TEST_COMPARE (status, 0);
  TEST_COMPARE (xwaitpid (tested_pid, &status, 0), tested_pid);
  TEST_COMPARE (status, 0);

  free (tested_pid_string);
  free (gdbscript);
  return 0;
}

#include <support/test-driver.c>

      reply	other threads:[~2021-04-19  9:05 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-16 15:56 Florian Weimer
2021-04-16 16:07 ` Simon Marchi
2021-04-16 16:12   ` Florian Weimer
2021-04-16 16:25   ` Pedro Alves
2021-04-16 16:28     ` Florian Weimer
2021-04-16 16:33       ` Pedro Alves
2021-04-16 16:43         ` Florian Weimer
2021-04-16 16:47           ` Pedro Alves
2021-04-16 16:53             ` Simon Marchi
2021-04-16 17:18               ` Pedro Alves
2021-04-16 17:26                 ` Florian Weimer
2021-04-16 17:33                 ` Simon Marchi
2021-04-16 18:29                   ` Pedro Alves
2021-04-16 18:35                   ` Florian Weimer
2021-04-16 17:28             ` Florian Weimer
2021-04-16 17:43               ` Pedro Alves
2021-04-19  9:06                 ` Florian Weimer [this message]

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=87eef663ur.fsf@oldenburg.str.redhat.com \
    --to=fweimer@redhat.com \
    --cc=emil.l.velikov@gmail.com \
    --cc=gdb-patches@sourceware.org \
    --cc=kevinb@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=pedro@palves.net \
    --cc=simon.marchi@polymtl.ca \
    /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).