我们调试程序的时候,有时候会发现当程序运行时,会出现cpu占用率很高的情况。
一般情况下,程序执行时,cpu占用率比较高的话,就会影响其它程序的执行,所以就需要对程序进行优化,查找程序运行时,程序中cpu占用率最高的线程,并优化之。
本文介绍Linux下如何使用gdb查找程序的cpu占用率最高的线程。
编写以下代码,并编译为test可执行程序。以下代码创建三个线程:
线程一每循环休眠1秒钟再执行代码;
线程二每循环休眠5毫秒再执行代码;
现成三每循环休眠0毫秒再执行代码;
理论上,这三个线程的CPU占用率应该是依次提高的:
#include <QCoreApplication>
#include <thread>
#include <chrono>
#include <iostream>
void run1()
{
//线程1 每1秒执行1次
while(true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "run1" << std::endl;
}
}
void run2()
{
//线程2 每5毫秒执行1次
while(true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(5));
std::cout << "run2" << std::endl;
}
}
void run3()
{
//线程2 每0毫秒执行1次
while(true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(0));
std::cout << "run3" << std::endl;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::thread t1(run1);
std::thread t2(run2);
std::thread t3(run3);
int ret = a.exec();
t3.join();
t2.join();
t1.join();
return ret;
}
将程序编译成可执行程序“test”,并运行之:
sudo ./test
首先,我们需要通过top指令获取test程序的进程ID(即主线程ID):
top
指令输出:
可见test程序的进程ID(主线程ID)是73045,其CPU占用率为78.7%,这样的CPU占用率,对于一个没有实现任何实际功能的程序来说,相当高了。
然后,通过执行 top -H -p 73045 获取test程序的所有线程ID:
top -H -p 73045
该指令输出如下:
可见,test产生了4个线程,其中73045是主线程(main函数),cpu占用率由低到高的线程依次是73046,73047和73048,从理论上分析可以,73046、73047和73048应该依次是我们代码中的run1、run2和run3。
最后,通过gdb显示yest程序的所有线程。
首先,attach到test程序:
gdb attach -p 73045
然后,在gdb中使用 thread apply all bt 指令显示所有线程信息:
thread apply all bt
由以上显示的信息,可见,线程对应关系如下:
Thread 4 -> 73048 -> run3
Thread 3 -> 73047 -> run2
Thread 2 -> 73046 -> run1
与我们代码完全一致。