GDB精确定位死锁位置技巧、竞争资源待获取方以及已占有方信息
在 gdb 中,可以使用 info threads
命令查看当前进程中所有线程的信息,包括线程 ID、状态、调用栈等信息。通过查看线程的调用栈,可以得知当前线程正在等待哪个互斥锁。
具体步骤如下:
-
在 gdb 中设置断点,以便在程序停下来时查看线程信息。例如,可以使用
break
命令设置断点:(gdb) break file.c:10
在上面的命令中,
file.c:10
表示在文件file.c
的第 10 行设置断点。 -
运行程序,使其停在断点处。
-
使用
info threads
命令查看当前进程中所有线程的信息。例如,可以使用如下的命令:(gdb) info threads
在上面的命令中,
info threads
表示要查看线程信息。 -
找到当前正在运行的线程,并查看其调用栈。例如,假设当前正在运行的线程 ID 为 3,可以使用如下的命令查看线程 3 的调用栈:
(gdb) thread 3 (gdb) where
在上面的命令中,
thread 3
表示切换到线程 3,where
表示查看线程 3 的调用栈。 -
查看调用栈中是否有
pthread_mutex_lock
函数的调用。如果有,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。例如,假设调用栈中有如下的函数调用:#0 0x00007ffff7bcf6db in poll () from /lib64/libc.so.6 #1 0x00007ffff7b5d8c6 in epoll_wait () from /lib64/libc.so.6 #2 0x00007ffff7d3d7f7 in ?? () from /lib64/libpthread.so.0 #3 0x00007ffff7d3c2e3 in pthread_mutex_lock () from /lib64/libpthread.so.0 #4 0x00000000004005f6 in thread_func (arg=0x0) at file.c:20
在上面的调用栈中,第 4 行是
pthread_mutex_lock
函数的调用,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。
需要注意的是,如果程序中有多个线程同时等待同一个互斥锁,那么通过查看调用栈可能无法确定当前线程正在等待哪个互斥锁。此时,可以通过查看互斥锁的地址,以及在其他线程中调用 pthread_mutex_lock
函数时打印的互斥锁地址,来确定当前线程正在等待哪个互斥锁。