多線程調試(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章