6.9. Debugging programs with multiple threads
In some operating systems, such as HP-UX and Solaris, a single program
may have more than one thread of execution. The precise semantics
of threads differ from one operating system to another, but in general
the threads of a single program are akin to multiple processes--except
that they share one address space (that is, they can all examine and
modify the same variables). On the other hand, each thread has its own
registers and execution stack, and perhaps private memory.
gdb provides these facilities for debugging multi-thread
programs:
automatic notification of new threads
thread threadno, a command to switch among threads
info threads, a command to inquire about existing threads
thread apply [threadno] [all] args,
a command to apply a command to a list of threads
thread-specific breakpoints
Warning: These facilities are not yet available on every
gdb configuration where the operating system supports threads.
If your gdb does not support threads, these commands have no
effect. For example, a system without thread support shows no output
from info threads, and always rejects the thread command,
like this:
(gdb) info threads
(gdb) thread 1
Thread ID 1 not known. Use the "info threads" command to
see the IDs of currently known threads. |
The gdb thread debugging facility allows you to observe all
threads while your program runs--but whenever gdb takes
control, one thread in particular is always the focus of debugging.
This thread is called the current thread. Debugging commands show
program information from the perspective of the current thread.
Whenever gdb detects a new thread in your program, it displays
the target system's identification for the thread with a message in the
form [New systag]. systag is a thread identifier
whose form varies depending on the particular system. For example, on
LynxOS, you might see
[New process 35 thread 27] |
when gdb notices a new thread. In contrast, on an SGI system,
the systag is simply something like process 368, with no
further qualifier.
For debugging purposes, gdb associates its own thread
number--always a single integer--with each thread in your program.
- info threads
Display a summary of all threads currently in your
program. gdb displays for each thread (in this order):
the thread number assigned by gdb
the target system's thread identifier (systag)
the current stack frame summary for that thread
An asterisk * to the left of the gdb thread number
indicates the current thread.
For example,
(gdb) info threads
3 process 35 thread 27 0x34e5 in sigpause ()
2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
at threadtest.c:68 |
On HP-UX systems:
For debugging purposes, gdb associates its own thread
number--a small integer assigned in thread-creation order--with each
thread in your program.
Whenever gdb detects a new thread in your program, it displays
both gdb's thread number and the target system's identification for the thread with a message in the
form [New systag]. systag is a thread identifier
whose form varies depending on the particular system. For example, on
HP-UX, you see
[New thread 2 (system thread 26594)] |
when gdb notices a new thread.
- info threads
Display a summary of all threads currently in your
program. gdb displays for each thread (in this order):
the thread number assigned by gdb
the target system's thread identifier (systag)
the current stack frame summary for that thread
An asterisk * to the left of the gdb thread number
indicates the current thread.
For example,
(gdb) info threads
* 3 system thread 26607 worker (wptr=0x7b09c318 "@") \
at quicksort.c:137
2 system thread 26606 0x7b0030d8 in __ksleep () \
from /usr/lib/libc.2
1 system thread 27905 0x7b003498 in _brk () \
from /usr/lib/libc.2 |
- thread threadno
Make thread number threadno the current thread. The command
argument threadno is the internal gdb thread number, as
shown in the first field of the info threads display.
gdb responds by displaying the system identifier of the thread
you selected, and its current stack frame summary:
(gdb) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause () |
As with the [New …] message, the form of the text after
Switching to depends on your system's conventions for identifying
threads.
- thread apply [threadno] [all] args
The thread apply command allows you to apply a command to one or
more threads. Specify the numbers of the threads that you want affected
with the command argument threadno. threadno is the internal
gdb thread number, as shown in the first field of the info
threads display. To apply a command to all threads, use
thread apply all args.
Whenever gdb stops your program, due to a breakpoint or a
signal, it automatically selects the thread where that breakpoint or
signal happened. gdb alerts you to the context switch with a
message of the form [Switching to systag] to identify the
thread.
Refer to Section 7.4 Stopping and starting multi-thread programs for
more information about how gdb behaves when you stop and start
programs with multiple threads.
Refer to Section 7.1.2 Setting watchpoints, for information about
watchpoints in programs with multiple threads.