mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-06 12:01:08 +03:00
Introduce the `DL_DEBUG_TLS` debug mask to enable detailed logging for Thread-Local Storage (TLS) and Thread Control Block (TCB) management. This change integrates a new `tls` option into the `LD_DEBUG` environment variable, allowing developers to trace: - TCB allocation, deallocation, and reuse events in `dl-tls.c`, `nptl/allocatestack.c`, and `nptl/nptl-stack.c`. - Thread startup events, including the TID and TCB address, in `nptl/pthread_create.c`. A new test, `tst-dl-debug-tid`, has been added to validate the functionality of this new debug logging, ensuring that relevant messages are correctly generated for both main and worker threads. This enhances the debugging capabilities for diagnosing issues related to TLS allocation and thread lifecycle within the dynamic linker. Reviewed-by: DJ Delorie <dj@redhat.com>
70 lines
2.3 KiB
C
70 lines
2.3 KiB
C
/* Test for thread ID logging in dynamic linker.
|
|
Copyright (C) 2025 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 checks that the dynamic linker correctly logs thread creation
|
|
and destruction. It creates a detached thread followed by a joinable
|
|
thread to exercise different code paths. A barrier is used to ensure
|
|
the detached thread has started before the joinable one is created,
|
|
making the test more deterministic. The tst-dl-debug-tid.sh shell script
|
|
wrapper then verifies the LD_DEBUG output. */
|
|
|
|
#include <pthread.h>
|
|
#include <support/xthread.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
static void *
|
|
thread_function (void *arg)
|
|
{
|
|
if (arg)
|
|
pthread_barrier_wait ((pthread_barrier_t *) arg);
|
|
return NULL;
|
|
}
|
|
|
|
static int
|
|
do_test (void)
|
|
{
|
|
pthread_t thread1;
|
|
pthread_attr_t attr;
|
|
pthread_barrier_t barrier;
|
|
|
|
pthread_barrier_init (&barrier, NULL, 2);
|
|
|
|
/* A detached thread.
|
|
* Deallocation is done by the thread itself upon exit. */
|
|
xpthread_attr_init (&attr);
|
|
xpthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
|
|
/* We don't need the thread handle for the detached thread. */
|
|
xpthread_create (&attr, thread_function, &barrier);
|
|
xpthread_attr_destroy (&attr);
|
|
|
|
/* Wait for the detached thread to be executed. */
|
|
pthread_barrier_wait (&barrier);
|
|
pthread_barrier_destroy (&barrier);
|
|
|
|
/* A joinable thread.
|
|
* Deallocation is done by the main thread in pthread_join. */
|
|
thread1 = xpthread_create (NULL, thread_function, NULL);
|
|
|
|
xpthread_join (thread1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#include <support/test-driver.c>
|