多线程调试(gdb命令行和使用集成开发qtcreator查看线程状态)

  我在qtcreator中用调用的gdb找不到如何显示线程号对应的线程名字,因此需要继续学习使用gdb进行多线程调试.
1.创建多线程工程
2.启动进程并查看运行进程对应的id
3.使用gdb连接进程,并查看进程

1.gdb命令行调试  

1.创建多线程工程

函数希望实现的功能为隔2s打印一次hello,1s打印一次world.但是,当使用 unique_lock

#include <iostream>
#include<thread>
#include<unistd.h>
#include<mutex>
using namespace std;
std::mutex mymutex;
class Hello{
public:
    Hello();
    ~Hello();
void  RunSayHello();
};
Hello::Hello(){

}
void Hello::RunSayHello()
{
    while(1)
    {
//        {
//            unique_lock<mutex> lock(mymutex);
//        }
        unique_lock<mutex> lock(mymutex);
        cout<<endl<<"hello"<<endl;
        sleep(1);
    }
}

class World{
public:
    World();
    ~World();
void  RunSayWorld();
};
World::World(){

};
void World::RunSayWorld()
{
    while(1)
    {
//        {
//            unique_lock<mutex> lock(mymutex);
//        }
         unique_lock<mutex> lock(mymutex);
         cout<<endl<<"world"<<endl;
         sleep(1.5);
    }
}

int main()
{
    Hello* hello=new Hello();
    World* world=new World();

     thread threadHello(&Hello::RunSayHello,hello);
     thread threadWorld(&World::RunSayWorld,world);
     threadHello.join();
     threadWorld.join();
   return 0;
}

注意编译的时候加上-g表示为debug模式
CMakeLists.txt

project(threaddebugtest)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wall -std=c++11 -pthread -g -march=native")
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

#2.用gdb查看线程状态

编译后进入到可执行文件文件夹,运行程序.调试的目的是查看每个线程的状态.
进程名字为threaddebugtest
调试步骤:
(1)启动进程 ./threaddebugtest
(2)查看进程id

ps -aux |grep threaddebugtest

这里写图片描述
id号为左上的23355
(3)进入gdb连接进程
新建终端输入

gdb

输入attach +进程id

attach 23355

这里写图片描述
表示连接成功
(4)查看当前进程的线程信息

(gdb) info thread

这里写图片描述
发现线程2_ _ lll_lock_wait(),说明线程2在等待释放锁
发现线程1 最后输出为pthread_join,说明主函数在等待线程结束
发现线程3 nanosleep(),说明此时线程3在执行sleep()

2.qtcreator查看线程状态

没想到集成开发环境这么方便,只需要注意两点就行

1.选上Threads
Window->Views->Threads
勾上
2.选上SnapShots
Window->Views->SnapShots
勾上
3.运行程序,在Threads状态栏双击对应的线程,表示选定某个线程
4.在SnapShots状态栏双击,可以看到当前线程的状态,会自动跳转该线程运行到那个地方
直接上图
这里写图片描述

注意:
有时候集成开发环境调试信息不全,需要加上参数
add_compile_options(-std=c++11 -pthread -g -Wall -O0 -fstack-protector -fstack-protector-all)
在gdb中使用命令调试

thread apply all bt

猜你喜欢

转载自blog.csdn.net/ktigerhero3/article/details/79971331
今日推荐