dwarf是如何处理的栈帧呢?

首先看下非dwarf的情况是如何处理栈帧的:

1 3623804982590 0x3e90 [0xb0]: PERF_RECORD_SAMPLE(IP, 0x1): 18561/18561: 0xffffffff8109dc91 period: 1 addr: 0
... FP chain: nr:12
..... 0: ffffffffffffff80
..... 1: ffffffff8109dc91
..... 2: ffffffff818244f2
..... 3: fffffffffffffe00
..... 4: 00007f54cc7c421f
..... 5: 0000000000400598
..... 6: 00000000004005b0
..... 7: 00000000004005d6
..... 8: 0000000000400663
..... 9: 0000000000400689
..... 10: 00007f54cc717830
..... 11: 075e258d4c544155
... thread: sleepFStack:18561
...... dso: /usr/lib/debug/boot/vmlinux-4.4.0-21-generic

我们可以看到,这里的0x400689,0x400664,0x4005b0都是栈中的下一跳ip的地址,但是对于dwarf的格式,中间却没有任何的用户栈的信息

1754 1 3984822066633 0x3e80 [0x80]: PERF_RECORD_SAMPLE(IP, 0x1): 18648/18648: 0xffffffff8109dc91 period: 1 addr: 0
1755 ... FP chain: nr:6
1756 ..... 0: ffffffffffffff80
1757 ..... 1: ffffffff8109dc91
1758 ..... 2: ffffffff818244f2
1759 ..... 3: fffffffffffffe00
1760 ..... 4: 00007f3b642d521f
1761 ..... 5: 074e258d4c544155
1762 ... thread: sleep:18648
1763 ...... dso: /usr/lib/debug/boot/vmlinux-4.4.0-21-generic

可见中间毫无用户态的栈出现,dwarf到底是怎样解析的用户栈?难道dwarf只有抓用户实践的时候才能抓到栈吗?

发生了奇妙的事情,当我的事件检测点是内核态的函数的时候,没有用户的数据,但是我以系统默认的branches指令输出的时候,就还有,通过lbr也可以,但是为啥就是通过dwarf的时候没有调用栈呢?

20821 11054598445494 0x47c50 [0x20e8]: PERF_RECORD_SAMPLE(IP, 0x4002): 13865/13865: 0x400577 period: 338726 addr: 0
20822 ... FP chain: nr:0
20823 ... user regs: mask 0xff0fff ABI 64-bit
20824 .... AX    0xece3f
20825 .... BX    0x0
20826 .... CX    0x0
20827 .... DX    0xece3f
20828 .... SI    0x27
20829 .... DI    0x17
20830 .... BP    0x4006e0
20831 .... SP    0x7ffdc56a5130
20832 .... IP    0x400577
20833 .... FLAGS 0x29f
20834 .... CS    0x33
20835 .... SS    0x2b
20836 .... R8    0x400750
20837 .... R9    0x7fbb18dd1ab0
20838 .... R10   0x846
20839 .... R11   0x7fbb18a17740
20840 .... R12   0x400470
20841 .... R13   0x7ffdc56a5390
20842 .... R14   0x0
20843 .... R15   0x0
20844 ... ustack: size 3792, offset 0xd8 <--------------------然后直接把user stack给打印出来了!!!!!! 20845  ... thread: sleep:13865
20846  ...... dso: /home/hon/codebox/gcc/sleep

从上面看,用户应该是有,用cycles事件去抓取数据时,是有用户态寄存器处理的,并且,然后就是根据寄存器的值去分析栈帧了,首先会得到栈的起始地址,然后是直接把user_stack给打印出来了!!!可以看一个具体的例子,在这个例子中我们通过看perf收集的裸的数据,就知道dwarf方式的内容的是怎么来的啦!所以这个也是在一定程序上说明了为啥同样的程序,我使用perf record -e --call-graph dwarf抓的时候,抓出来的数据会大很多,那不就是用户态的栈么!!!!因为当有frame pointer的时候,栈直接在用户态解析好,但是如果没有frame pointer,那么我会dump出来整个用户态的栈!!所以能用fp就用fp!!!

有了这样一层的考虑,所以内核基本上是不允许在tracepoint当使用 --call-graph dwarf选项时是不允许在tp事件上抓取的,但是硬件事件就不同了,因为他们是异步的,并不会直接阻塞到程序的执行,所以本质上不会干扰到程序的执行?

不是这样的考虑,因为事件是发生在了内核态,当发生用户态的事情的时候,我们发现竟然。。。。。

仍然是没有用户栈的信息呀!但是现在的问题是所有的问题都交给了用户态,但是为啥就没有解析出来呢?

dwarf是怎样处理的栈帧?的更多相关文章

  1. dwarf是如何处理栈帧的?

    dwarf是如何处理栈帧的? DW_AT_frame_base 表明函数栈帧的起始点 95 < 1><0x000000ca>    DW_TAG_subprogram 96   ...

  2. 再看perf是如何通过dwarf处理栈帧的

    从结构体stack_dump入手, util/unwind-libunwind-local.c 中有函数access_mem #0 access_mem (as=0x1f65bd0, addr=140 ...

  3. 使用gdb查看栈帧的情况, 没有ebp

    0x7fffffffdb58: 0x004005ba  0x00000000  0x00000000  0x00000000 <-----funcb的栈帧 [0x7fffffffdb60, 0x ...

  4. 图解JVM字节码执行引擎之栈帧结构

    一.执行引擎      “虚拟机”的概念是相对于“物理机”而言的,这两种“机器”都有执行代码的能力.物理机的执行引擎是直接建立在硬件处理器.物理寄存器.指令集和操作系统层面的:而“虚拟机”的执行引擎是 ...

  5. 栈帧%ebp,%esp详解

    首先应该明白,栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部( ...

  6. c函数调用过程原理及函数栈帧分析

    转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707       今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比 ...

  7. Linux下追踪函数调用,打印栈帧

    事情的起因是这样的,之前同事的代码有一个内存池出现了没有回收的情况.也就是是Pop出来的对象没有Push回去,情况很难复现,所以在Pop里的打印日志,跟踪是谁调用了它,我想在GDB调试里可以追踪调用的 ...

  8. Linux - 函数的栈帧

    栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储.为单个过程(函数调用)分配的那部分栈称为栈帧.栈帧其实是两个指针寄存器, 寄存器%ebp为帧 ...

  9. JAVA栈帧

    简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...

随机推荐

  1. C语言学习记录_2019.02.04

    逻辑性变量的定义符:bool,在C语言中只有true和false: 定义方式:bool t = true; 逻辑运算符: !:逻辑非 &&:逻辑与 ||:逻辑或 表达区间的错误形式:4 ...

  2. LVS那些事

    1998年,章文嵩博士成立了Linux Virtual Server的自由软件项目,进行Linux服务器集群的开发工作. 他的目标是:使用集群技术和Linux操作系统实现一个高性能.高可用的服务器,它 ...

  3. 佛山Uber优步司机奖励政策(12月14日到12月20日)

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

  4. EDM站点

    设计邮件模版 http://templates.mailchimp.com/

  5. DMA是什么意思

    DMA是让硬盘不用通过CPU来控制读写 它的意思是直接存储器存取,是一种快速传送数据的机制,DMA技术的重要性在于,利用它进行数据存取时不需要CPU进行干预,可提高系统执行应用程序的效率.利用DMA传 ...

  6. protected修饰符详解

    protected这个修饰符,各大参考书都会这样说:访问权限为类内,包内和子类,因此在父类中定义的方法和成员变量如果为protected修饰的,是可以在不同包中的子类进行访问的,示例代码如下: pac ...

  7. 虚拟机克隆CentOs后网卡问题

    1.直接修改  /etc/sysconfig/network-scripts/ifcfg-eth0 删掉UUID HWADDR配置静态地址 2.修改配置文件vi /etc/udev/rules.d/7 ...

  8. Linux命令应用大词典-第8章 日期和时间

    8.1 cal:显示日历信息 8.2 date:显示和设置系统日期和时间 8.3 hwclock:查看和设置硬件时钟 8.4 clock:查看和设置硬件时钟 8.5 clockdiff:主机之间测量时 ...

  9. Appium ——Android KEYCODE键值:

    Python下语法: driver.keyevent(键值) 电话按键: 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME ...

  10. 详解Jedis连接池报错处理

    在使用Jedis连接池模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException:Could not get a re ...