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

news2024/11/13 10:19:48

我们调试程序的时候,有时候会发现当程序运行时,会出现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.coloradmin.cn/o/2038362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技产 Amazon Neptune 图数据库服务体验

目录 图数据库为什么使用图数据库Amazon Neptune实践登陆创建 S3 存储桶notebook图神经网络快速构建加载数据配置端点Gremlin 查询删除环境删除 S3 存储桶 总结 图数据库 图数据库是一种专门用于存储和处理图形数据结构的数据库管理系统。图形数据结构由节点&#xff08;Node&…

轻松打造:基于本地知识库的私有GPT助手定制教程”

背景知识 众所周知&#xff0c;目前大模型 LLM 的能力已经非常强大&#xff0c;chatgpt 已经可以很好的解决通用型问题&#xff0c;但是对于垂直专业领域的问题处理的还不够好。如果要利用 LLM 大模型根据已有的特定领域的知识&#xff0c;推理出该领域特定问题的答案&#xf…

node.js part1

Node.js Node.js 是一个跨平台JavaScript 运行环境&#xff0c;使开发者可以搭建服务器端的 JavaScript 应用程序。作用&#xff1a;使用Node.js编写服务器端程序 编写数据接口&#xff0c;提供网页资源浏览功能等等 前端工程化&#xff1a;为后续学习Vue和React等框架做铺垫. …

51单片机学习记录-数码管操作

这里实现了静态数码管的显示。51单片机一共有可以显示4个数字&#xff0c;可以通过控制P2(4-2)的端口选择8个数字显示器中的一个显示数字&#xff0c;控制P0端口写入显示的数值信息。将操作的逻辑使用了函数Nixie进行了封装。 #include <8051.h>unsigned char NixieTabl…

PHP汽车保养维修信息管理系统小程序源码

&#x1f697;爱车守护神器&#xff01;揭秘“汽车保养维修信息管理系统”全攻略&#x1f50d; &#x1f525;【开篇揭秘&#xff1a;为何你需要它&#xff1f;】&#x1f525; 在这个快节奏的时代&#xff0c;爱车不仅是代步工具&#xff0c;更是生活品质的象征。但你是否曾…

C++_基本语法笔记_继承和多态

继承 思想与Java差不多 基本语法 语法&#xff1a;class 子类 : 继承方式 父类 继承方式 将访问权限&#xff0c;上升到保护权限&#xff0c;上升到更高的私有权限 继承哪些部分 继承过程中&#xff0c;即使权限不能访问&#xff0c;也会全部继承下来&#xff08;非静…

Liunx搭建Rustdesk远程桌面服务

1、环境准备 Linux&#xff1a;centos7.9 rustdesk server安装包 很多新服务器并没有 wget 和unzip 可以通过yum自行安装下&#xff0c;如果系统中有wget但不能使用&#xff0c;直接卸载重装即可。 yum install wget wget --no-check-certificate https://github.com/rust…

商家福音!阿里巴巴1688又一线下选品中心落地!

7月31日&#xff0c;阿里旗下1688台州选品中心正式开园。后续1688将在核心产业带陆续开设线下选品中心。选品中心的运营模式为“四位一体”&#xff1a;政府搭台&#xff0c;1688提供技术、销售渠道和数字化能力&#xff0c;本地产业链的链主负责运营&#xff0c;本地源头工厂入…

跟着iMeta学做图|ggplot2绘制多个饼图展示菌群物种组成

原始教程链接&#xff1a;https://github.com/iMetaScience/iMetaPlot/tree/main/221017multi-pieplot 写在前面 饼图 (Pie Plot) 在微生物组研究中可以用来展示菌群物种组成&#xff0c;可以起到与堆叠柱状图相同的展示效果。本期我们挑选2022年4月5日刊登在iMeta上的The imp…

浅谈大模型私有化+精调:面向垂直行业与特定场景之需

今天将继续“AI技术”系列&#xff0c;探讨大模型的私有化和精调&#xff0c;以便让预训练的通用模型更好地适应特定的任务或行业需求。 当然&#xff0c;从产品经理的视角出发&#xff0c;我们不会非常深入&#xff08;鄙人能力也有限&#xff09;&#xff0c;而是建立相关的…

HTTP协议和web服务器(Tomcat)

Author&#xff1a;Dawn_T17&#x1f965; 目录 二.请求协议 三.响应协议 四.协议解析 Socket 编程 Servlet介绍 Web服务器 五.Tomcat 简介 HTTP 即超文本传输协议 它是一种应用层协议&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 为什…

《网络安全自学教程》- Linux安全标识符、身份鉴别、访问控制

《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统中的用户和进行身份鉴别。依据系统安全策略对用户的操作进行访问控制&#xff0c;防止用户和外来入侵者对计算机资源的非法访问。…

mysql误删数据恢复记录

背景 1、数据库版本 5.7.36&#xff0c;由于误操作删掉了表的所有数据&#xff0c;但是数据库备份每天凌晨进行、只能从备份恢复昨日的全量数据&#xff0c;当日的数据将会丢失 查看binlog配置 尝试恢复 1、找到binlog文件 误删除后立即刷新binlog flush logs 2、binlog转…

OpenAI GPT-2 model use with TensorFlow JS

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…

010集——按值传递、按引用传递等方法——C#学习笔记

按值传递参数 这是参数传递的默认方式。在这种方式下&#xff0c;当调用一个方法时&#xff0c;会为每个值参数创建一个新的存储位置。 实际参数的值会复制给形参&#xff0c;实参和形参使用的是两个不同内存中的值。所以&#xff0c;当形参的值发生改变时&#xff0c;不会影…

MDK常见概念

&#xff08;1&#xff09;typedef定义结构体类型 typedef struct {uint32_t BaudRate;uint32_t WordLength;uint32_t StopBits;uint32_t Parity;uint32_t Mode;uint32_t HwFlowCtl;uint32_t OverSampling; } UART_InitTypeDef; &#xff08;2&#xff09;寄存器 (3)DMA DMA 是…

2024年第八届计算生物学与生物信息学国际会议 (ICCBB 2024)即将召开!

2024 年第八届计算生物学和生物信息学国际会议&#xff08;ICCBB 2024&#xff09;将于2024年11月28 -30在日本京都召开&#xff0c;ICCBB 2024是展示理论、实验和应用计算生物学和生物信息学领域新进展和研究成果的主要论坛之一。我们相信&#xff0c;通过大家的共同努力&…

【问题】容器部署场景Spring Bean偶尔循环依赖问题

问题描述 在本地开发中不会发生循环依赖问题&#xff0c;但是在容器场景下&#xff0c;制作成镜像启动后异常出现Bean的循环依赖。 问题原因 开发者在代码中使用构造函数注入来引用依赖的 Bean&#xff0c;这种方式可能导致循环依赖问题。虽然 Spring 框架具备循环依赖的处理…

thinkphp漏洞之sql注入漏洞-builder处漏洞

目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注&#xff1a;thinkphp版本&#xff1a;5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本&#xff0c;下载think文件&#xff0c;…

乳制品企业怎么防止信息泄露?使用加密软件保障数据安全

乳,制品行业使用加密软件主要是为了保障企业的核心数据安全&#xff0c;防止敏感信息泄露&#xff0c;如:产品配方、生产流程、销售数据等&#xff0c;通过使用加密软件&#xff0c;来保护重要的数据.。一、加密软件在乳制品企业的重要性1、保护重要数据:乳制品企业拥有大量敏感…