perf打印调用栈的过程
perf_prepare_sample-->perf_callchain-->get_perf_callchain
上面的调用栈会使用
perf_event_output-->
0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]
0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]
0xffffffff81183c1a : perf_swevent_overflow+0x9a/0xc0 [kernel]
0xffffffff81183c9d : perf_swevent_event+0x5d/0x80 [kernel]
0xffffffff81183e5c : perf_tp_event+0x19c/0x1b0 [kernel] 这个函数第一次有了regs
0xffffffff811620fb : perf_syscall_enter+0x1db/0x1f0 [kernel]
0xffffffff81003b7b : syscall_trace_enter_phase2+0x1cb/0x1e0 [kernel]
0xffffffff818245cb : tracesys_phase2+0x2d/0x8d [kernel]
对调用栈的一些理解,首先如果栈采集在用户态的话,那么肯定是没有内核栈的,但是如果是才加到内核态的话,那么可能是有用户态的栈的,但是对于系统进程来说,同样是没有用户态的栈的。怎么判断是在用户态还是内核态,是指采样点所位于的函数位置,
0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]
0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]
0xffffffff811844d4 : perf_event_overflow+0x14/0x20 [kernel]
0xffffffff8100fd7e : __intel_pmu_pebs_event+0x1ee/0x240 [kernel]
0xffffffff8100ff55 : intel_pmu_drain_pebs_nhm+0x185/0x350 [kernel]
0xffffffff8100c549 : intel_pmu_handle_irq+0x279/0x460 [kernel]
0xffffffff810056bd : perf_event_nmi_handler+0x2d/0x50 [kernel]
0xffffffff810323a9 : nmi_handle+0x69/0x120 [kernel]
0xffffffff810328e0 : default_do_nmi+0x40/0x100 [kernel]
0xffffffff81032a82 : do_nmi+0xe2/0x130 [kernel]
0xffffffff81826906 : nmi+0x56/0xa5 [kernel]
tracepoint事件
0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]
0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]
0xffffffff81183c1a : perf_swevent_overflow+0x9a/0xc0 [kernel]
0xffffffff81183c9d : perf_swevent_event+0x5d/0x80 [kernel]
0xffffffff81183e5c : perf_tp_event+0x19c/0x1b0 [kernel]
0xffffffff810a7bb6 : perf_trace_sched_switch+0x166/0x190 [kernel] vim include/trace/perf.h +32
0xffffffff8181fdd7 : __schedule+0x427/0xa10 [kernel]
0xffffffff818203f5 : schedule+0x35/0x80 [kernel]
0xffffffff818238e5 : schedule_hrtimeout_range_clock+0xc5/0x1b0 [kernel]
x86的中断寄存器
regs是在perf_fetch_caller_regs(在perf_trace_sched_switch函数中)中获取ip,cs,bp,sp是最重要的三个寄存器,其中cs寄存器来表明当前是在内核态还是用户态,ip是当前在执行的指令,bp是栈指针寄存器。这里是返回内核态, tracepoint都是返回内核态,有了cs,bp,sp就足够拿到函数的调用栈了,内核态和用户态有各自的unwind的方法。所有的tracepoint都是在内核态,
perf打印调用栈的过程的更多相关文章
- 在c或c+程序里打印调用栈。转
在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...
- android打印调用栈
在某些机器上,不能下断点,出现了某个诡异的问题,想到唯一的解决方式,就是打印调用栈了,google发现这个,记录下,以后备用 Log.d(",Log.getStackTraceString( ...
- kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下
kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下
- 利用backtrace和backtrace_symbols函数打印调用栈信息
在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include <execinfo.h> int backtrace(void * ...
- 在C/C++程序里打印调用栈信息
我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...
- java 中打印调用栈
source-code: public class A { public A() {} private static void printStackTrace() { StackTra ...
- python 打印调用栈
import traceback def BBQ(): traceback.print_stack() 引入 traceback 包,在某个函数中执行 traceback.print_stack().
- Lua中如何实现类似gdb的断点调试--03通用变量修改及调用栈回溯
在前面两篇01最小实现及02通用变量打印中,我们已经实现了设置断点.删除断点及通用变量打印接口. 本篇将继续新增两个辅助的调试接口:调用栈回溯打印接口.通用变量设置接口.前者打印调用栈的回溯信息,后者 ...
- java方法的理解、调用栈与异常处理
一.流程分支 If/else :基于boolean值的双分支 Switch:基于数字(整数.char.byte.枚举).字符串 类型的多分支 Int month =5; Switch 二.方法meth ...
随机推荐
- vim 对齐线
** 从https://github.com/Yggdroot/indentLine下载 indentLine插件 git clone https://github.com/Yggdroot/inde ...
- HBase简介(梳理知识)
一. 简介 hbase是bigtable的开源山寨版本.是建立的hdfs之上,提供高可靠性.高性能.列存储.可伸缩.实时读写的数据库系统.它介于nosql和RDBMS之间,仅能通过主键(row key ...
- 模仿淘宝首页写的高仿页面,脚本全用的原生JS,菜鸟一枚高手看了勿喷哈
自己仿照淘宝首页写的页面,仿真度自己感觉可以.JS脚本全是用原生JavaScript写得,没用框架.高手看了勿喷,请多多指正哈!先上网页截图看看效果,然后上源码: 上源码,先JavaScript : ...
- 天津Uber优步司机奖励政策(12月28日到12月29日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- QImage对一般图像的处理
QImage对一般图像的处理 Qt中QImage类封装了对于一般图像像素级的操作,图像显示则使用QPixmap. 本文说说对一般图像(常见格式,图像不大)的处理,比如将彩色图像处理为灰度图像.首先要获 ...
- 【转载】深入研究Windows内部原理绝对经典的资料
原文:深入研究Windows内部原理绝对经典的资料 另一篇资料:深入研究Windows内部原理系列 (为了方便大家下,我打包了放在一下地址: 1-6:http://download.csdn.net/ ...
- Centos7 下安装以及使用mssql
Centos7下安装以及使用Mssql,在这下面玩,主要是发现linux环境下的mysql非常的小,小到只有169M,这在windows上面,动撤几个G的安装文件,会让你直接打消使用MSSQL的勇气, ...
- Sql Server 2008R2中使用CET进行递归查询
在使用数据库的过程中,我们经常会遇到递归的查询.比如传入一个分类ID,要查出这个分类下的所有子分类,以及子分类的子分类.或者说传入一个部门ID,要查出这个部门下所有子部门的人员:在Or ...
- 在ubuntu trusty下安装python的rasterio库
就这些吧.. apt-get update -y apt-get install -y software-properties-common add-apt-repository ppa:ubuntu ...
- 分享开源的GB/T-2260国家行政区划代码
项目中需要用到省市数据,在网上搜了一下,很多旧数据,稍微新一点的下载就要积分.X币什么的,很不爽,最后在GitHub上找到一个开源的,还有各种语言版本的,非常方便! https://github.co ...