forked from Imagelibrary/binutils-gdb
Add two options to "info threads": `-stopped` and `-running`.
The purpose of these options is to filter the output of the command.
The `-stopped` option means "print stopped threads only" and,
similarly, `-running` means "print the running threads only". When
both options are provided by the user, the indication is that the user
wants the union. That is, the output contains both stopped and
running threads.
Suppose we have an application with 5 threads, 2 of which have hit a
breakpoint. The "info threads" command in the non-stop mode gives:
(gdb) info threads
Id Target Id Frame
* 1 Thread 0x7ffff7d99740 (running)
2 Thread 0x7ffff7d98700 something () at file.c:30
3 Thread 0x7ffff7597700 (running)
4 Thread 0x7ffff6d96700 something () at file.c:30
5 Thread 0x7ffff6595700 (running)
(gdb)
Using the "-stopped" flag, we get
(gdb) info threads -stopped
Id Target Id Frame
2 Thread 0x7ffff7d98700 something () at file.c:30
4 Thread 0x7ffff6d96700 something () at file.c:30
(gdb)
Using the "-running" flag, we get
(gdb) info threads -running
Id Target Id Frame
* 1 Thread 0x7ffff7d99740 (running)
3 Thread 0x7ffff7597700 (running)
5 Thread 0x7ffff6595700 (running)
(gdb)
Using both flags prints all:
(gdb) info threads -stopped -running
Id Target Id Frame
* 1 Thread 0x7ffff7d99740 (running)
2 Thread 0x7ffff7d98700 something () at file.c:30
3 Thread 0x7ffff7597700 (running)
4 Thread 0x7ffff6d96700 something () at file.c:30
5 Thread 0x7ffff6595700 (running)
(gdb)
When combined with a thread ID, filtering applies to those threads that
are matched by the ID.
(gdb) info threads 3
Id Target Id Frame
3 Thread 0x7ffff7597700 (running)
(gdb) info threads -stopped 3
No threads matched.
(gdb)
Regression-tested on X86_64 Linux.
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
Approved-by: Pedro Alves <pedro@palves.net
78 lines
1.6 KiB
C
78 lines
1.6 KiB
C
/* This testcase is part of GDB, the GNU debugger.
|
|
|
|
Copyright 2022-2025 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
|
|
#define NUM 4
|
|
|
|
static pthread_barrier_t threads_started_barrier;
|
|
|
|
static void
|
|
stop_here ()
|
|
{
|
|
}
|
|
|
|
static void
|
|
spin ()
|
|
{
|
|
while (1)
|
|
usleep (1);
|
|
}
|
|
|
|
static void *
|
|
work (void *arg)
|
|
{
|
|
int id = *(int *) arg;
|
|
|
|
pthread_barrier_wait (&threads_started_barrier);
|
|
|
|
if (id % 2 == 0)
|
|
stop_here ();
|
|
else
|
|
spin ();
|
|
|
|
pthread_exit (NULL);
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
/* Ensure we stop if GDB crashes and DejaGNU fails to kill us. */
|
|
alarm (10);
|
|
|
|
pthread_t threads[NUM];
|
|
int ids[NUM];
|
|
|
|
pthread_barrier_init (&threads_started_barrier, NULL, NUM + 1);
|
|
|
|
for (int i = 0; i < NUM; i++)
|
|
{
|
|
ids[i] = i;
|
|
pthread_create (&threads[i], NULL, work, &ids[i]);
|
|
}
|
|
|
|
/* Wait until all threads are seen running. */
|
|
pthread_barrier_wait (&threads_started_barrier);
|
|
|
|
stop_here ();
|
|
|
|
return 0;
|
|
}
|