gdb 调试多线程

以boost thread为例:

#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds) {
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

void thread1() {
  while (1) {
    wait(1);
    std::cout << boost::this_thread::get_id() << std::endl;
  }
}

void thread2() {
  while (1) {
    wait(1);
    std::cout << boost::this_thread::get_id() << std::endl;
  }
}

int main() {
  boost::thread t1(thread1);
  boost::thread t2(thread2);
  t1.join();
  t2.join();
  return 1;
}

使用gdb进行编译:g++ -std=c++11 -g -Wall -I/usr/local/boost/include testThread.cpp -L/usr/local/boost/lib -lboost_system -lboost_thread -o testThread (其中boost库的头文件路径和库路径为安装boost所在路径)

1. 首先使用ps命令查看线程及线程间关系

ps aux | grep testThread  查看当前运行的线程

ps -aL | grep testThread 查看当前运行的轻量级线程

pstree -p 主线程id 查看主线程和新线程之间的关系

pstack 线程id 查看线程的线程栈结构

以下为上面代码的测试结果:

查看主线程堆栈:

查看新线程堆栈:

2. gdb调试多线程

gdb attach 主线程id

info 查看进程和线程信息,info inferiors查看进程,info threads查看所有线程,*为当前线程,thread n切换到第n个线程,bt查看线程栈结构。

只运行当前线程: set scheduler-locking on 和所有线程并发运行: set scheduler-locking off

切换到某一线程时,实际调试过程和普通的调试程序一样,用break添加断点,n进行下一步。

3. 调试多线程的命令总结如下:

命令 用法
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程
thread ID(1,2,3…) 切换当前调试的线程为指定ID的线程
break thread_test.c:123 thread all(例:在相应函数的位置设置断点break pthread_run1) 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command
thread apply all command 让所有被调试线程执行GDB命令command
set scheduler-locking 选项 command 设置线程是以什么方式来执行命令
set scheduler-locking off 不锁定任何线程,也就是所有线程都执行,这是默认值
set scheduler-locking on 只有当前被调试程序会执行
set scheduler-locking on step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行

原文地址:https://www.cnblogs.com/sssblog/p/10815184.html

时间: 2024-11-08 22:52:58

gdb 调试多线程的相关文章

gdb调试多线程的简单命令

由于平时的编程当中经常会用到多线程,我想接触过多线程编程的人应该都会清楚多线程如果出了错,调起bug来是有多么麻烦,应为你某个地方出错了,有可能并不是这里的问题而是线程执行到这就切换到其他线程,而出错的是其他线程,我以前使用的办法是给某个线程sleep然后让内核自己调度去执行其他线程.很明显这种方法当有很多线程是并不是很使用,所以我就翻书学了几条调试多线程的简单gdb命令 1.测试所用的代码 1void *thread1(void *arg) 2{ 3 printf("New thread1\n

使用gdb调试多线程程序总结

转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break thread_test.c:123 thread all在所有线程中相应的行上设置断点thread apply ID1 ID

GDB调试多线程

先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break thread_test.c:123 thread all 在所有线程中相应的行上设置断点 thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command. thread apply all c

gdb调试多线程程序总结

http://www.cnblogs.com/aixingfou/archive/2011/07/28/2119875.html http://blog.csdn.net/nancygreen/article/details/14226925 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. b

用GDB调试多线程程序

一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break thread_test.c:123 thread all 在所有线程中相应的行上设置断点 thread apply ID1 ID2 command 让一个或者

如何使用GDB调试多线程

先写一段多线程程序. makefile 加上 -g参数生成可调式信息, 可以进行调试. pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败.在gcc编译的时候,附加要加 -lpthread参数即可解决. gdb test 进入调试 需要调试的地方打下断点,run运行到断点处. r 运行到断点处,info thread可以查看被调试的线程. thread apply all bt 让所有线程打印堆栈信息 set scheduler

GDB调试多线程程序

gdb有thread相关命令,如info thread(简写成info th)显示线程消息,b xx thread yy可以针对某个thread设置断点,thread xx(简写成thr xx)切换到某个thread. 再配合frame(简写f)相关的命令(比如up,down在不同frame间跳转),基本可以处理若干个不同的线程间的debug…… 其他的debugger,应该也会有同样的功能. 不过如果用的线程比较多的话……建议还是写一些辅助函数,在debug过程中打印出tid,然后对比一些蹊跷

GDB调试——启动调试程序

一.启动 >>gdb启动 gdb 调试之前加载调试符号,即编译时候加 –g选项,如 gcc file.c –g –o target 启用gdb的方法种有3种,一种是启动core,还有是attach一个已经运行的进程. 1. gdb <program> 2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件. 3. gdb <program> <PID> 如果你

gdb 调试openmp多线程程序 示例介绍

 首先一个简单程序源代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <omp.h> 4 int main(int argc, char * argv[]){ 5 int i, k,m,n; 6 printf("i=%d,threads_num=%d\n",i, omp_get_num_threads()); 7 printf("i=%d,thread_id=%d\n&quo