• 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都是在内核态,

  • 相关阅读:
    Linux curl命令详解
    php技能树---大神的进阶之路
    PHP Socket 编程之9个主要函数的使用之测试案例
    史上最全的PHP正则表达式
    php 简单使用redis 队列示例
    PHP中使用 Memcached 的测试案例
    机动车驾驶(1)--- 禁令标志汇总 by John
    闵可夫斯基和(Mincowsky sum)
    二维平面上判断点是否在三角形内
    计算任意多边形的面积
  • 原文地址:https://www.cnblogs.com/honpey/p/9271344.html
Copyright © 2020-2023  润新知