如何排查C++程序的CPU占用过高的问题

news2025/3/31 8:06:45

文章目录

  • 可能的原因
    • 程序设计的BUG
    • 系统资源问题
    • 恶意软件
    • 硬件问题
  • 通常步骤
  • 一个简单的问题代码
  • 在windows平台上如何排查
    • Windows Process Explorer
    • WinDBG
  • 在Linux平台如何排查
    • 使用TOP + GDB
    • Perf

可能的原因

程序设计的BUG

  • 有死循环
  • 低效算法与数据结构
  • 滥用自旋锁
  • 频繁的系统调用,导致用户态与内核态频繁切换

系统资源问题

  • 内存不足,系统频繁使用硬盘交换分页

恶意软件

  • 后台运行的病毒或流氓软件或自动更新的软件

硬件问题

  • 散热不良
  • 硬件老化

通常步骤

  1. 找到问题的进程
  2. 找到问题的线程
  3. 找到问题的代码位置
  4. 分析原因

一个简单的问题代码

#include <iostream>
#include <thread>
#include <vector>

void busy_task() 
{
    while(true) {}
}

void slow_algorithm() 
{
    for (auto i = 0L ; i < 1000000000L; ++i)
    {
        volatile auto x = i * i;
    }
}

int main()
{
    std::vector<std::thread> threads;
    threads.emplace_back(busy_task);
    threads.emplace_back(slow_algorithm);
    for(auto& t: threads)
    {
        t.join();
    }
    return EXIT_SUCCESS;
}

程序以DEBUG模式编译成fst0.exe 与 fst0.pdb

在windows平台上如何排查

Windows Process Explorer

需要借助工具WindowsProcessExplorer
fst0.exe 在运行中
以管理员权限运行ProcExp,切记32 位的fst0.exe 要用32位的ProcExp,64位的fst0.exe要用64位的ProcExp
过滤出目标同时打开线程窗口
在这里插入图片描述

可以看到占用CPU过高的线程
在这里插入图片描述
我们需要设置符号文件路径
在这里插入图片描述

在这里插入图片描述
32位的程序用32位的pdb符号文件路径,64位的程序用64位的pdb符号文件路径
然后右键点击线程中的调用堆栈
在这里插入图片描述
在这里插入图片描述
可以清晰的看到程序是卡在busy_task那个函数上了!

WinDBG

怎么安装WinDbg这里就跨过,使用WinDbg时要切记,32位的程序使用32位的WinDbg调试,同时要使用32位pdb文件,64位的程序使用64位的WinDbg调试,同时要使用64位的pdb文件WinDbg最好用管理员权限打开
先行设置好符号路径与源码路径
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

现在Fst0.exe 已经在运行当中了,使用WinDbg来附加到进程,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到这里WinDbg执行 int 3 软中断暂停了进程。

在这里插入图片描述

在Command里面执行!runaway看看各个线程的执行时间,可以看到4号线程执行时间最长
可以看看4号线程的调用堆栈
在这里插入图片描述
可以明显看到卡在了busy_task 函数,点击后面的蓝色链接可以看到源码
在这里插入图片描述

在Command里面使用qd命令退出调试

更多关于WinDBG的知识请上网自行搜索学习

在Linux平台如何排查

使用TOP + GDB

先以Debug模式编译出fst0

g++ -g fst0.cc -o fst0 -lpthread

然后运行 fst0
然后使用top
在这里插入图片描述
可以看到fst0的cpu占用很高
现在知道fst0的进程号是2473,还需要知道fst0的耗时线程是哪个
执行

top -H -p 2473

可以得到线程信息
在这里插入图片描述
可以看到有两个线程,2473主线程号与进程号相同,2474是耗时的那个子线程号
现在需要把2474那个线程的堆栈信息打印出来

sudo gdb -p 2474 -ex "thread apply all bt" -ex "detach" -ex "quit" > stack.log
cat stack.log

在这里插入图片描述
可以清楚看到程序是卡在busy_task函数,fst0.cc 文件的第8行那里。

更多gdb 相关知识自行上网学习。

Perf

perf 是Linux内核提供的性能分析工具。若你需要此工具,安装步骤如下:

# 更新软件包列表
sudo apt update

# 安装与当前内核匹配的linux-tools
sudo apt install linux-tools-$(uname -r)

# 验证安装
perf --version

编译程序,运行程序,打到程序PID与上面方法相同
使用perf实时查看进程热点,动态显示系统中消耗 CPU 最多的函数或进程

# 全局监控所有进程的热点
sudo perf top

# 仅监控指定 PID 的进程
sudo perf top -p <PID>

例子
在这里插入图片描述
清晰的看到耗时函数是哪个

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324109.html

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

相关文章

Linux云计算SRE-第二十一周

构建单节点prometheus&#xff0c;部署node exporter和mongo exporter。构建kibana大盘。包含主机PU使用率&#xff0c;主机MEM使用率&#xff0c;主机网络包速度。mongo db大盘&#xff0c;包含节点在线状态&#xff0c;读操作延迟等 一、实验环境准备 - 节点信息&#xff1…

无人机,云台参数设置,PWM输出控制云台俯仰

目录 1、云台与飞控的连接 2、PX4飞控控制云台&#xff0c;QGC地面站的设置 3、遥控器映射通道设置 4、其他设置 4.1、COM_PREARM_MODE&#xff0c;预解锁模式 4.2、RC9_DZ &#xff0c;遥控器通道死区设置 1、云台与飞控的连接 首先确定一下&#xff0c;设置飞控第几路…

EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路

一、案例背景 某电子制造企业的5G通信模块组装线&#xff0c;采用西门子S7-1200PLC&#xff08;ProfiNet主站&#xff09;进行产线调度&#xff0c;而精密组装工序由3台海克斯康工业机器人&#xff08;EtherCAT从站&#xff09;完成。由于协议差异&#xff0c;机器人动作与PLC…

网络中常用协议

一, TCP协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网核心协议之一&#xff0c;位于传输层&#xff0c;为应用层提供可靠的、面向连接的数据传输服务。 1. TCP的核心特点 特性说明面向连接通信前需通过三次握手建立连接&a…

自动驾驶04:点云预处理03

点云组帧 感知算法人员在完成点云的运动畸变补偿后&#xff0c;会发现一个问题&#xff1a;激光雷达发送的点云数据包中的点云数量其实非常少&#xff0c;完全无法用来进行后续感知和定位层面的处理工作。 此时&#xff0c;感知算法人员就需要对这些数据包进行点云组帧的处理…

Linux内核软中断分析

一、软中断类型 在Linux内核中&#xff0c;中断处理分为上半部&#xff08;硬中断&#xff09;和下半部。上半部负责快速响应硬件事件&#xff0c;而下半部用于处理耗时任务&#xff0c;避免阻塞系统。下半部有三种机制&#xff1a;软中断&#xff08;Softirq&#xff09;、小任…

Linux修改默认shell为zsh

一、修改模型shell为zsh 1、检查当前使用的shell echo $SHELL 2、检查当前系统支持的shell cat /etc/shells# 输出结果显示如下&#xff1a; """ /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/csh /bin/tcsh /usr/bin/csh /usr/bin/tcsh /usr/bin/zsh…

[ComfyUI] 如何升级自定义节点(Custom Nodes)

ComfyUI 提供了灵活的 自定义节点(Custom Nodes) 功能,允许用户扩展其能力。随着插件的更新,保持 Custom Nodes 处于最新状态是确保兼容性和功能完整性的关键。 1. 手动升级(Git Pull 方式) 如果你的 自定义节点 是通过 Git 克隆的,可以使用 Git 命令来升级: 步骤: …

linux和windows是采用何种机制保存密码的?

传统Linux的不足&#xff1a; 1&#xff09;存在特权用户root 任何人只要得到root的权限&#xff0c;对于整个系统都可以为所欲为。这一点Windows也一样。 &#xff12;)对于文件的访问权划分不够细 在linux系统里&#xff0c;对于文件的操作&#xff0c;只有「所有者」…

matlab打开两个工程

1、问题描述 写代码时&#xff0c;需要实时参考别人的代码&#xff0c;需要同时打开2个模型&#xff0c;当模型在同一个工程内时&#xff0c;这是可以直接打开的&#xff0c;如图所示 2、解决方案 再打开一个MATLAB主窗口 这个时候就可以同时打开多个模型了 3、正确的打开方…

HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析

注&#xff1a;适用版本&#xff08;Harmony OS NEXT / 5.0 / API 12 &#xff09; 一、效果展示 二、技术栈 HarmonyOS ArkUI框架 使用AppStorage实现跨组件状态管理&#xff0c;PersistentStorage持久化存储用户偏好。 系统配置常量 ConfigurationConstant.Color…

60V单通道高精度线性恒流LED驱动器防60V反接SOD123封装

产品描述: PC561A 系列产品是用于产生单通道、高精度恒流源&#xff08; Constant Current Regulator&#xff0c; CCR&#xff09; 的LED 驱动芯片&#xff0c;为各类 LED 照明应用提供高性价比恒流方案。PC561A 采用晶体管自偏置技术&#xff0c;可在超宽工作电压范围内维持…

学习threejs,使用Sprite精灵、SpriteMaterial精灵材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…

本地AI大模型部署革命:Ollama部署和API调试教程

Ollama&#xff1a;你的私人AI助手 还在为云端AI服务的高昂费用和隐私问题而烦恼吗&#xff1f;Ollama横空出世&#xff0c;它是一款专为本地环境打造的大模型部署神器&#xff0c;让你轻松在自己的设备上运行各种强大的AI模型。无论你是开发者还是普通用户&#xff0c;Ollama…

centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件

问题现象&#xff1a;VMware虚拟机新添加的网卡&#xff0c;能看到网卡&#xff0c;但是看不到网卡的配置文件 解决方案&#xff1a; nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件&#xff0c;这里con…

K8S学习之基础五十一:k8s部署jenkins

k8s部署jenkins 创建nfs共享目录&#xff0c; mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv创建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…

在 Mermaid 流程图里“驯服”quot;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…