|Debugging with GDB|
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:
libthread_dbto use if the default choice isn't compatible with the program.
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
threadcommand, 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]’, where systag is a thread identifier whose form varies depending on the particular system. For example, on gnu/Linux, you might see
[New Thread 0x41e02940 (LWP 25582)]
when gdb notices a new thread. In contrast, on an SGI system, the systag is simply something like ‘process 368’, with no further qualifier.
thread name, below), or, in some cases, by the program itself.
An asterisk ‘*’ to the left of the gdb thread number indicates the current thread.
(gdb) info threads Id Target Id Frame 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 Solaris, you can display more information about user threads with a Solaris-specific command:
(gdb) thread 2 [Switching to thread 2 (Thread 0xb7fdab70 (LWP 12747))] #0 some_function (ignore=0x0) at example.c:8 8 printf ("hello\n");
As with the ‘[New ...]’ message, the form of the text after ‘Switching to’ depends on your system's conventions for identifying threads.
The debugger convenience variable ‘$_thread’ contains the number of the current thread. You may find this useful in writing breakpoint conditional expressions, command scripts, and so forth. See See Convenience Variables, for general information on convenience variables.
thread apply [threadno
thread applycommand allows you to apply the named command to one or more threads. Specify the numbers of the threads that you want affected with the command argument threadno. It can be a single thread number, one of the numbers shown in the first field of the ‘info threads’ display; or it could be a range of thread numbers, as in
2-4. To apply a command to all threads, type thread apply all command.
thread name [name
On some systems, such as gnu/Linux, gdb is able to determine the name of the thread as given by the OS. On these systems, a name specified with ‘thread name’ will override the system-give name, and removing the user-specified name will cause gdb to once again display the system-specified name.
thread find [regexp
As well as being the complement to the ‘thread name’ command, this command also allows you to identify a thread by its target systag. For instance, on gnu/Linux, the target systag is the LWP id.
(gdb) thread find 26688 Thread 4 has target id 'Thread 0x41e02940 (LWP 26688)' (gdb) info thread 4 Id Target Id Frame 4 Thread 0x41e02940 (LWP 26688) 0x00000031ca6cd372 in select ()
set print thread-events
set print thread-events on
set print thread-events off
set print thread-eventscommand allows you to enable or disable printing of messages when gdb notices that new threads have started or that threads have exited. By default, these messages will be printed if detection of these events is supported by the target. Note that these messages cannot be disabled on all targets.
show print thread-events
See Stopping and Starting Multi-thread Programs, for more information about how gdb behaves when you stop and start programs with multiple threads.
See Setting Watchpoints, for information about watchpoints in programs with multiple threads.
libthread_db. If you omit path, ‘libthread-db-search-path’ will be reset to its default value (
$sdir:$pdiron gnu/Linux and Solaris systems). Internally, the default value comes from the
On gnu/Linux and Solaris systems, gdb uses a “helper”
libthread_db library to obtain information about threads in the
inferior process. gdb will use ‘libthread-db-search-path’
libthread_db. gdb also consults first if inferior
specific thread debugging library loading is enabled
by ‘set auto-load libthread-db’ (see libthread_db.so.1 file).
A special entry ‘$sdir’ for ‘libthread-db-search-path’ refers to the default system directories that are normally searched for loading shared libraries. The ‘$sdir’ entry is the only kind not needing to be enabled by ‘set auto-load libthread-db’ (see libthread_db.so.1 file).
A special entry ‘$pdir’ for ‘libthread-db-search-path’
refers to the directory from which
was loaded in the inferior process.
libthread_db library gdb finds in above directories,
gdb attempts to initialize it with the current inferior process.
If this initialization fails (which could happen because of a version
libthread_db, and continue with the next directory.
If none of
libthread_db libraries initialize successfully,
gdb will issue a warning and thread debugging will be disabled.
libthread-db-search-path is currently implemented
only on some platforms.
set debug libthread-db
show debug libthread-db
libthread_db-related events. Use