我在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