Linux下用gdb找到cpu占用率最高的线程

server/2024/12/22 20:22:22/

我们调试程序的时候,有时候会发现当程序运行时,会出现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

与我们代码完全一致。


http://www.ppmy.cn/server/99137.html

相关文章

Django 安装指南

Django 安装指南 Django 是一个高级 Python Web 框架,它鼓励快速开发和干净、实用的设计。本指南将详细介绍如何在不同的操作系统上安装 Django。 在 Windows 上安装 Django 安装 Python: 访问 Python 官网 python.org。下载并安装适合您系统的 Python 版本。确保在安装过程…

修复本地终端(windows)连接服务器使用zsh出现乱跳的问题

目前市面上还没有发现解决方案&#xff0c;记录一下&#xff01; 1.起因&#xff1a; 在服务器配置了zsh后&#xff0c;用本地的windows去连接的时候&#xff0c;终端内容会出现乱跳&#xff0c;比如输入了一个“l”&#xff0c;后面出现多个“lll”&#xff0c;如下: ⚡ roo…

程序员短视频上瘾综合症

一、是你疯了还是面试官疯了&#xff1f; ​ 最近有两个学员咨询问题&#xff0c;把我给整得苦笑不得。大家来看看&#xff0c;你有没有同样的症状。 ​ 第一个学员说去一家公司面试&#xff0c;第一轮面试聊得挺好的。第二轮面试自我感觉良好&#xff0c;但是被面试官给Diss…

Linux中安装MYSQL数据库

文章目录 一、MYSQL数据库介绍1.1、MySQL数据库的基本概述1.2、MySQL数据库的主要特性1.3、MySQL数据库的技术架构与组件1.4、MySQL数据库的应用与扩展性1.5、MySQL数据库的许可模式与开源生态 二、MySQL Workbench和phpMyAdmin介绍2.1、MySQL Workbench介绍2.2、phpMyAdmin介绍…

多功能一千平米气膜馆:无限可能的空间利用—轻空间

随着现代建筑技术的不断进步&#xff0c;气膜结构馆逐渐成为各种应用场景的理想选择。一千平米的气膜馆&#xff0c;以其灵活的设计和高效的建设速度&#xff0c;为各类活动提供了广阔的可能性。以下是一些一千平米气膜馆的主要应用场景&#xff0c;展示了其在不同领域中的巨大…

VUE项目双token刷新 vue项目token无感刷新

VUE项目双token刷新 vue项目token无感刷新 该方法无需让后端单独提供刷新接口 开发环境 前端&#xff1a;vue3 vite element axios 后端&#xff1a;thinkphp8.0 token生成方式&#xff1a;jwt 前端代码 import axios from "axios"; import { toast, getTo…

LVS实验(实现服务器集群的负载均衡)

基本概念 LVS&#xff08;Linux Virtual Server&#xff09;是Linux虚拟服务器的简称。 LVS通过将一个真实服务器集群虚拟成一台服务器来对外提供服务&#xff0c;同时在集群内部实现负载均衡。这种技术能够显著提高服务的处理能力和可靠性&#xff0c;降低单台服务器的负载压…

计算机网络-CSP初赛知识点整理

历年真题 [2016-NOIP-普及-第3题] 以下不属于无线通信技术的是( ) A. 蓝牙 B. Wifi C. GPRS D. 以太网 [2015-NOIP-普及-第10题] FTP 可以用于( )。 A. 远程传输文件 B. 发送电子邮件 C. 浏览网页 D. 网上聊天 [2019-CSP-J-第1题] 中国的国家顶级域名是( ). A. .cn B. .ch C.…