使用 gdb 调试
gdb ./your_program
(gdb) run
(gdb) thread apply all bt
还可以分析pthread_mutex内部,查看owen字段分析哪个线程占用的锁,一个可能的 pthread_mutex 内部结构可以大致表示为:
typedef struct pthread_mutex_t {
int state; // 锁的状态,0 表示未锁定,1 表示已锁定
pthread_t owner; // 当前锁的拥有者线程
int recursive_count; // 递归锁计数
pthread_cond_t waiters; // 等待队列
int type; // 锁的类型,例如 PTHREAD_MUTEX_NORMAL
} pthread_mutex_t;
使用 strace 追踪系统调用
strace -f -p <pid>
通过查看进程的 fcntl 或 pthread_mutex_lock 等系统调用,来识别死锁发生的原因
使用 valgrind 和 helgrind 检测数据竞争和死锁
valgrind --tool=helgrind ./your_program
使用 ThreadSanitizer 检查线程问题
g++ -fsanitize=thread -g -o your_program your_program.cpp
./your_program