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