关于c++:性能分析之CPU分析从CPU调用高到具体代码行CC

9次阅读

共计 1354 个字符,预计需要花费 4 分钟才能阅读完成。

明天在培训的过程中,也提到了剖析要具体到代码的事件,如果思路方向是正确的,对 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 棵!然而把树换成电线杆就有人不会算了。

正文完
 0