GDB多线程调试的基本命令
info threads
:显示当前可调试的所有线程,GDB会给每个线程分配一个Id。前面有“ * ”号的表示当前正在调试的线程。
thread Id
:切换当前调试的线程为指定线程。
break FileName.cpp:LinuNum thread all
:所有线程都在文件FileName.cpp的第LineNum行有断点。
thread apply ID1 ID2 IDN command
:让线程编号是ID1,ID2…等等的线程都执行command命令。如:thread apply 1 3 bt,即线程1,3执行bt。
thread apply all command
:所有线程都执行command命令。
set scheduler-locking off|on|step
:在调试某一个线程时,其他线程是否执行。在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让它运行。其中:
- off:不锁定任何线程,所有线程都执行,默认值。
- on:锁定其他线程,只有当前线程执行。
- step:在step(单步)时,只有被调试线程运行。即阻止其他线程在当前线程单步调试的时候抢占当前线程,只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的机会。
show scheduler-locking
: 查看当前锁定线程的模式。
GDB多线程调试实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void* ThreadEntry1(void* arg){
(void)arg;
printf("Thread1!\n");
pthread_exit(NULL);
return NULL;
}
void* ThreadEntry2(void* arg){
(void)arg;
printf("Thread2!\n");
pthread_exit(NULL);
return NULL;
}
int main(){
printf("Main Thread!\n");
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, ThreadEntry1, NULL);
pthread_create(&tid2, NULL, ThreadEntry2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
1、设置断点
Enb为 y 时表示该断点启用,Enb为 n 时表示该断点禁用。
2、查看当前可调试的线程
有“ * ”号的表示当前正在调试的线程
运行到断点2时,显示可以调试的线程有3个,正在运行的为线程1(线程Id为2)
3、查看所有线程堆栈信息
4、切换线程
切换成功后发现“ * ”号的位置发生变化
5、查看当前锁定线程的模式