今天在培训的过程中,也提到了分析要具体到代码的事情,如果思路方向是正确的,对java应用和C/C++应用来说,也是几个命令就可以跳到代码行了。前提是要能看得懂堆栈信息。所以一直以来我在讲课的过程中都有画过这样的一个分析思路的图。

在性能分析中,如果是C/C++的应用的话,也同样是有些工具可以做得到的。

今天我们来看一个简单的C代码示例,看下如何做到这几步。我在网上看到有一段示例代码,也省得自己写了。就直接拿来编译用了。下面来看一下操作。

[root@7dgroup Sample6]# gcc -o test6 -g test6.c

编译的时候记得加-g的参数,可以生成调试信息。

[root@7dgroup Sample6]# ./test6

运行起来:

[root@7dgroup Sample6]# ./test6

返回值 :3

返回值 5

返回值 :5

返回值 7

返回值 :7

返回值 9

执行过程会产生这样的数据。同时查看top。

看到31356这个进程已经消耗了CPU。因为这个进程非常的简单,所以这里我就不再细化到线程级了。直接打堆栈看了。

(如果是复杂的应用的话,在这一步,还要再细化一步的就是打印线程级的状态。方法有多种,可以用top -H,也可以pidstat,也可以用调试工具attach上去再查threaddump。总之选择自己喜欢的方式就好。)

直接gstack打印堆栈。

[root@7dgroup ~]# gstack 31356

#0  0x00000000004005ed in function2 (input=963) at test6.c:4

#1  0x000000000040065b in function1 (a=9, b=10) at test6.c:21

#2  0x00000000004006e8 in main () at test6.c:39

当然你也可以pstack打印堆栈(因为我重新运行了一次,所以PID变了)。

[root@7dgroup ~]# pstack 31438

#0  0x0000000000400620 in function3 (input=3524) at test6.c:14

#1  0x000000000040067e in function1 (a=5, b=6) at test6.c:25

#2  0x00000000004006e8 in main () at test6.c:39

通过堆栈信息就可以看出来,这里面只有一个线程,并且调用关系是:

第一次打印的堆栈是:39行 -> 21行 -> 4行

第二次打印的堆栈是:39行 -> 25行 -> 14行

(因为是同一个文件,所以我只写行号了)。

这样就可以在C/C++的应用中从CPU分析到具体的代码行了。

再重复强调,分析思路的完整性非常重要。要先知道想看什么数据,才能知道用什么工具去做。会工具没什么了不起,但是把原理搞清楚又能融会贯通才是真的厉害。

可能有人会说,我连工具都不知道怎么用,怎么知道看什么数据呢。看似悖论的一个问题,实际上就是经验不足,需要多学习基础的知识。

比如说,了解了linux上运行java语言的分析过程,那其他的分析过程也是类似的,只是工具不同。并不是说只会分析linux上运行java,换成HPunix+C/C++就没有思路了。

就像小学做的数学题一样:一行有四棵树,总共四行,共有几棵树?16棵!        但是把树换成电线杆就有人不会算了。

性能分析之CPU分析-从CPU调用高到具体代码行(C/C++)的更多相关文章

  1. 性能分析之CPU分析-从CPU调用高到具体代码行(JAVA)

      通常情况下,性能报告中只说CPU使用率高的时候,并不能帮助定位问题.因为CPU高会有多种不同的情况.CPU有五种状态(us sy id wa st), 在vmstat中能显示出来,这个想必很多人都 ...

  2. Python 获取被调用函数名称,所处模块,被调用代码行

    获取被调用函数名称,所处模块,被调用代码行 by:授客 QQ:1033553122 module2.py: #!/usr/bin/env python # -*- coding:utf-8 -*- _ ...

  3. PC虚拟现实应用的性能分析与优化:从CPU角度切入

    如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...

  4. DIY Ruby CPU 分析——Part I

    [编者按]原文作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是DIY Ruby CPU Profiling 的第 ...

  5. DIY Ruby CPU 分析——Part III

    [编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...

  6. DIY Ruby CPU 分析 Part II

    [编者按]作者 Emil Soman,Rubyist,除此之外竟然同时也是艺术家,吉他手,Garden City RubyConf 组织者.本文是 DIY Ruby CPU Profiling 的第二 ...

  7. 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题

    一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...

  8. linux概念之cpu分析

    http://ilinuxkernel.com/?cat=4 Linux CPU占用率原理与精确度分析1  CPU占用率计算原理在Linux/Unix 下,CPU 利用率分为用户态.系统态和空闲态,分 ...

  9. jstack来分析。当linux出现cpu被java程序消耗过高时

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

随机推荐

  1. Linux-鸟菜-0-计算机概论

    Linux-鸟菜-0-计算机概论 这一章在说计算机概论,额....,总的来说看完之后还是有点收获,回忆了下计算机基本知识.没有什么可上手操作的东西,全是概念,直接把最后的总结给截图过来吧,因为概念的话 ...

  2. 【maven】IDEA工程右边的maven配置中Plugins有重复的命令

    问题 解决 换一个IDEA的版本,比如2020.02 参考链接 https://ask.csdn.net/questions/1060938 https://bbs.csdn.net/topics/3 ...

  3. 详解Tomcat核心配置、http协议

    Tomcat服务器 Tomcat配置与部署(IDEA) https://www.cnblogs.com/gonghr/p/14731266.html Tomcat手工创建和打包第一个Web工程 在ap ...

  4. SpringBoot系列——自定义统一异常处理

    前言 springboot内置的/error错误页面并不一定适用我们的项目,这时候就需要进行自定义统一异常处理,本文记录springboot进行自定义统一异常处理. 1.使用@ControllerAd ...

  5. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

  6. OAuth2.0 授权方式及步骤梳理总结

    OAuth 2.0授权协议使第三方应用程序可以通过协调资源所有者和HTTP服务之间的批准交互,或者通过允许第三方应用程序代表资源所有者来获得对HTTP服务的有限访问权,或者代表资源所有者. 代表自己获 ...

  7. Mybatis-plus在原有的select查询语句中动态追加查询条件

    一.适用场景 1.使用了xml形式的mapper.2.不想在select查询中大量使用<if>标签来判断条件是否存在而加入条件. 二.步骤 1.自定义wrapper继承QueryWrapp ...

  8. 云计算OpenStack核心组件---nova计算服务(7)

    一.nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...

  9. 源码篇:Flutter Provider的另一面(万字图文+插件)

    前言 阅读此文的彦祖,亦菲们,附送一枚Provider模板代码生成插件! 我为啥要写这个插件呢? 此事说来话短,我这不准备写解析Provider源码的文章,肯定要写这框架的使用样例啊,然后再哔哔源码呀 ...

  10. Redis持久化锦囊在手,再也不会担心数据丢失了

    大家好,我是小羽. Redis 的读写都是在内存中进行的,所以它的性能高.而当我们的服务器断开或者重启的时候,数据就会消失,那么我们该怎么解决这个问题呢? 其实 Redis 已经为我们提供了一种持久化 ...