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打印调用栈的过程的更多相关文章

  1. 在c或c+程序里打印调用栈。转

    在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...

  2. android打印调用栈

    在某些机器上,不能下断点,出现了某个诡异的问题,想到唯一的解决方式,就是打印调用栈了,google发现这个,记录下,以后备用 Log.d(",Log.getStackTraceString( ...

  3. kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

    kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

  4. 利用backtrace和backtrace_symbols函数打印调用栈信息

    在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include <execinfo.h>  int backtrace(void * ...

  5. 在C/C++程序里打印调用栈信息

    我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...

  6. java 中打印调用栈

    source-code: public class A { public A() {} private static void printStackTrace() {         StackTra ...

  7. python 打印调用栈

    import traceback def BBQ(): traceback.print_stack() 引入 traceback 包,在某个函数中执行 traceback.print_stack().

  8. Lua中如何实现类似gdb的断点调试--03通用变量修改及调用栈回溯

    在前面两篇01最小实现及02通用变量打印中,我们已经实现了设置断点.删除断点及通用变量打印接口. 本篇将继续新增两个辅助的调试接口:调用栈回溯打印接口.通用变量设置接口.前者打印调用栈的回溯信息,后者 ...

  9. java方法的理解、调用栈与异常处理

    一.流程分支 If/else :基于boolean值的双分支 Switch:基于数字(整数.char.byte.枚举).字符串 类型的多分支 Int month =5; Switch 二.方法meth ...

随机推荐

  1. 第5天 Java基础语法

    第5天 Java基础语法 今日内容介绍 方法 方法 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这 ...

  2. json传值给前端页面,出现堆栈溢出问题

    用的com.alibaba.fastjson.JSONObject这个包 原因:JSONObject将对象转json字符串时候没有关闭循环引用导致的堆栈溢出. 解决办法是 使用这个 JSONObjec ...

  3. pygame---制作一只会转弯的小乌龟

    Pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚. 包含图像.声音. 建立在S ...

  4. 20145234黄斐《Java程序设计》第二周学习总结

    教材学习内容总结 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Type),其中类类型也叫参考类型(Reference Type). 字节类型,也叫byte类型, ...

  5. 北京Uber优步司机奖励政策(1月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. [Jmeter]jmeter之BeanShell Sampler测试应用

    前言: 在做接口测试的时候,有些接口做了签名校验,而签名是根据某算法进行加密,这时候,简单的接口测试工具无法完成该工作,所以想到了Jmeter,他是java编写,有强大的扩展性,足矣完成我们需要的操作 ...

  7. == vs === in Javascript

    本文来自网易云社区 作者:魏文庆 如果你只想知道==与===的区别,请直接看总结,当然我更希望您能耐心看完全文.Javascript中用于相等比较的操作符有两个==和===.==我们通常称为" ...

  8. 11gR2RAC更换CRS磁盘组文档

    磁盘(pv)准备     在生产环境中,提前从存储上划分一些磁盘挂载到RAC系统的两个节点上(node1,node2).     新增加磁盘组为(hdisk14--hdisk24) 1.1磁盘使用规划 ...

  9. cf#516B. Equations of Mathematical Magic(二进制,位运算)

    https://blog.csdn.net/zfq17796515982/article/details/83051495 题意:解方程:a-(a^x)-x=0 给出a的值,要求计算解(非负)的个数 ...

  10. 2019年1月23日,好像是这个日子,RF发布了 1.7.3.1 支持python3.6以上了,安装成功。

    安装步骤:(win10 家庭版 64) 1.安装Python3.7.2,记得勾选添加Path 2.pip install robotframework 3.pip install wxPython 4 ...