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>
prev parent 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).