Trace
Linux和Android系统下各种trace手段分析。
pwl999
莫听穿林打叶声,何妨吟啸且徐行。
展开
-
Linux Hook (目录)
Hook技术是性能优化和安全加固的基础。1、内核态1.1、LSM Hook1.2、Ftrace Hook (LivePatch)1.3、Inline Hook Syscall2、用户态2.1、PLT Hook & Inline Hook原创 2021-03-04 09:59:40 · 1210 阅读 · 1 评论 -
Linux用户态程序 Inject & Hook
文章目录1. 背景介绍1.1 Inject方式1.2 Hook方式2 Inject方式2.1 静态注入2.2 动态注入3. PLT/GOT hook3.1 原理3.2 hook so3.3 hook exe4. inline hook4.1 hook 某个函数4.2 hook 任意位置参考文档:1. 背景介绍1.1 Inject方式我们要hook一个应用,首先我们需要有手段往目标程序添加代码。这种动作一般称之为inject注入,常见的注入手段分为两种:静态注入 (elf的DT_NEED)动态注入原创 2020-08-21 17:10:26 · 2801 阅读 · 0 评论 -
Inline Hook Syscall 详解
文章目录1. hook一般syscall2. hook stub syscall2.1 stub_xxx 原理2.2 方法1:hook `stub_xxx`2.3 方法2:hook `call sys_xxx`参考文档:1. hook一般syscall在安全、性能分析等领域,经常会需要对系统调用syscall进行hook。有些模块在kernel代码中已经预先hook,例如syscall trace event。通常syscall使用sys_call_table[]数组来间接调用:kernel\arc原创 2020-07-20 18:00:04 · 2594 阅读 · 0 评论 -
Ftrace Hook (Linux内核热补丁) 详解
文章目录1. Ftrace Hook 原理1.1 Ftrace Hook框架1.2 对外接口2. Ftrace Hook 实例2.1 hook 过程2.2 CONFIG_DYNAMIC_FTRACE_WITH_REGS 特性支持3. 内核热补丁实例3.1 热补丁原理3.2 实例参考文档:1. Ftrace Hook 原理关于ftrace hook的原理在Linux ftrace一文中有详细的解析,本文就简单的阐述其原理。1.1 Ftrace Hook框架Ftrace Hook的初始设计主要是给ft原创 2020-07-18 11:21:09 · 4965 阅读 · 1 评论 -
使用ftrace分析函数性能
0. 背景ftrace的功能非常强大,可以在系统的各个关键点上采集数据用以追踪系统的运行情况。既支持预设的静态插桩点(trace event),也支持每个函数的动态插桩(function tracer)。还可以利用动态插桩来测量函数的执行时间(function graph tracer)。关于ftrace的详细操作和原理分析可以参考Linux ftrace一文。本文的主要目的主要是利用ftrace来做新增代码的性能分析和优化,应用的主要场景如下:我们在现有的代码中增加了一批新函数A_*()。功能完成原创 2020-07-01 17:01:13 · 3870 阅读 · 1 评论 -
LSM(Linux Security Modules)框架原理解析
1. 基本原理LSM是内核安全模块的一套框架,本质是插桩法。它的主要有两个特点:1、在内核安全相关的关键路径上插入了Hook点:内核安全相关的关键对象有:task_struct(任务和进程)、linux_binprm(程序)、super_block(文件系统)、inode(管道、文件或者 socket套接字)、file(打开的文件)、sk_buff(网络缓冲区)、net_device(网络设备)、ker_ipc_perm(Semaphore消息,共享内存段,消息队列)、msg_msg(单个消息)原创 2020-07-01 16:32:44 · 10675 阅读 · 0 评论 -
火焰图(FlameGraph)的使用
文章目录1. Perf基础1.1 Perf的安装1.2 Perf的使用2. 火焰图2.1 生成火焰图2.2 生成红蓝差分火焰图2.3 oncpu/offcpu参考文档:1. Perf基础1.1 Perf的安装ubuntu 18.04:sudo apt install linux-tools-common linux-tools-4.15.0-106-generic linux-cloud-tools-4.15.0-106-generic1.2 Perf的使用1、查看perf支持的监控event原创 2020-06-16 14:25:42 · 12282 阅读 · 0 评论 -
Systrace 解析
上图基本就能说清systrace的整个框架:1、systrace调用atrace抓取目标机的trace数据;2、systrace把trace数据和’prefix.html’、‘suffix.html’、'systrace_trace_viewer.html’合成一个’trace.html’文件;3、使用chrome浏览器打开’trace.html’就可以非常方便的以图形化的形式来查看和分...原创 2018-10-29 18:35:57 · 12464 阅读 · 1 评论 -
Linux Bpf+Bcc (目录)
1、内核态解析:1.1、bpf内核框架2、用户态(前端)解析:2.1、bcc3、参考资料:3.1、Berkeley Packet Filter (BPF) (Kernel Document) 3.2、BPF and XDP Reference Guide3.3、DTrace for Linux 20163.4、bcc/BPF Tool End-User Tutorial3.5、b...原创 2018-10-16 11:47:49 · 1932 阅读 · 0 评论 -
Linux bpf 2.1、bcc的实现
bcc全称为(BPF Compiler Collection),它是模仿gcc(GNU Compiler Collection)的命名风格。BPF是运行在内核态的一种虚拟机语言,我们在用户态可以通过Clang+LLVM把c语言编译成BPF目标码,然后通过加载器loader(bcc/perf/iproute2)将BPF目标码通过bpf()系统调用加载到内核当中,最后通过perf的ioctl命令PE...原创 2018-10-16 11:46:35 · 3563 阅读 · 1 评论 -
Linux bpf 1.1、BPF内核实现
BPF的字面上意思Berkeley Packet Filter意味着它是从包过滤而来。如果在开始前对BPF缺乏感性的认识建议先看一下参考文档:“3.1、Berkeley Packet Filter (BPF) (Kernel Document)”、“3.2、BPF and XDP Reference Guide”。本质上它是一种内核代码注入的技术:内核中实现了一个cBPF/eBPF虚拟机;...原创 2018-09-28 15:36:04 · 18720 阅读 · 1 评论 -
Linux bpf 3.2、BPF and XDP Reference Guide
开源软件Cilium深度的使用了BPF来做网络安全,它的文档中使用了一个章节专门的来介绍BPF的原理和使用。参考原文:BPF and XDP Reference Guide 注意:本文档部分针对的是希望深入了解BPF和XDP的开发人员和用户。尽管阅读本参考指南可能有助于拓宽你对Cilium的理解,但使用Cilium并不是必须的。请参考入门指南和概念以获得更高级别的介绍。BPF是L...翻译 2018-09-14 17:45:32 · 6890 阅读 · 1 评论 -
Linux bpf 3.1、Berkeley Packet Filter (BPF) (Kernel Document)
关于bpf最早是应用于network的filter,后续才被应用到trace,所以kernel中关于bpf的文档是”Documentation/networking/filter.txt”。参考原文:Linux Socket Filtering aka Berkeley Packet Filter (BPF)1、简介:LSF(Linux Socket Filtering)是从BPF...翻译 2018-09-07 20:44:42 · 5255 阅读 · 0 评论 -
Linux perf 1.4、hardware events
可以通过perf list命令来查看系统中的hardware event:# simpleperf list hwList of hardware events: cpu-cycles instructions cache-references cache-misses branch-misses还有hardware-cache event:# simp...原创 2018-08-02 16:24:52 · 5633 阅读 · 1 评论 -
Linux perf 1.3、software events
可以通过perf list命令来查看系统中的software event:# simpleperf list swList of software events: cpu-clock task-clock page-faults context-switches cpu-migrations minor-faults major-faults alignm...原创 2018-07-31 15:20:38 · 2237 阅读 · 2 评论 -
Linux ftrace 1.2、trace event
Linux trace中,最基础的就是:function tracer和trace event。鉴于他们搭建的良好的框架(ringbuffer、tracefs),各种trace纷纷投奔而来。tracer发展出了function、function_graph、irqsoff、preemptoff、wakeup等一系列tracer。而event也发展出tracepoint、kprobe、upr...原创 2018-05-30 18:44:14 · 10683 阅读 · 3 评论 -
Linux ftrace 1.3、tracer (function、function_graph、irq_off)
如trace event一章的描述,任何一种trace都离不开以下流程:函数插桩。使用各种插桩方式把自己的trace函数插入到需要跟踪的probe point上;input trace数据。在trace的probe函数被命中时,会存储数据到ringbuffer当中;这里还包括filter和trigger功能;ouput trace数据。用户或者程序需要读出trace数据,根据需要输出ra...原创 2018-06-08 19:08:15 · 6667 阅读 · 2 评论 -
Linux ftrace 2.1、ftrace的使用
关于Ftrace的使用,最权威的解读就在”Documentation/trace”文件夹下,我们挑选其中最经典的几个文件来进行翻译,加上自己理解的解读。参考原文:ftrace - Function Tracer1、背景:Ftrace本来设计作为一个内部的tracer提供给系统的开发者和设计者,帮助他们弄清kernel正在发生的行为。它能够调试分析延迟和性能问题。Ftrace发展...翻译 2018-05-23 15:41:15 · 7824 阅读 · 4 评论 -
Linux ftrace 2.2、trace event的使用
参考原文:Event Tracing1、Introduction:Tracepoints用来创建event tracing框架,而不需要使用创建模块来注册probe函数。不是所有的tracpoint都能够使用event tracing系统来跟踪。内核开发者必须提供代码定义信息怎么保存到tracing buffer、已经信息怎么打印出来。2、 Using Event Trac...翻译 2018-05-23 19:34:19 · 10355 阅读 · 0 评论 -
Linux ftrace 2.3、kprobe event的使用
原始的trace event插桩是静态的:使用TRACE_EVENT()定义tracepoint,并且在代码中显式调用tracepoint。而kprobe机制可以实现在内核运行时动态的插桩,利用kprobe机制我们可以动态的插入trace event,实现和静态trace event同样的功能。参考原文:Kprobe-based Event Tracing1、Overview这些e...翻译 2018-05-24 10:54:20 · 6436 阅读 · 1 评论 -
Linux ftrace 2.4、uprobe event的使用
uprobe是用户态的探针,它和kprobe是相对应的,kprobe是内核态的探针。uprobe需要制定用户态探针在执行文件中的位置,插入探针的原理和kprobe类似。参考原文:Uprobe-tracer: Uprobe-based Event Tracing1、Overviewuprobe event类似于kprobe event。在编译内核时配置CONFIG_UPROBE_EV...翻译 2018-05-24 12:02:45 · 4433 阅读 · 0 评论 -
Linux ftrace 1.4、kprobe event
从前面几章看:trace event使用静态tracepoint插桩,function tracer使用“bl _mcount”的插桩点来动态插桩。既然都是插桩,为什么我们不使用功能强大的kprobe机制?kprobe event就是这样的产物。krpobe event和trace event的功能一样,但是因为它采用的是kprobe插桩机制,所以它不需要预留插桩位置,可以动态的在任何位置进行...原创 2018-06-14 10:24:35 · 2535 阅读 · 0 评论 -
Linux ftrace 1.5、syscall event
1、函数插桩1.1、”events/raw_syscalls/sys_enter”、”events/raw_syscalls/sys_exit” trace event的插桩在系统调用的出口、入口路径上,系统布置了两个tracepoint格式的trace event。el0_svc为用户态系统调用的入口,arch\arm64\kernel\entry.S:/* * EL0...原创 2018-06-15 10:28:15 · 3156 阅读 · 0 评论 -
Linux Ftrace (目录)
Ftrace从字面上理解=Function trace,但是发展到现在已经不仅仅是function trace而是一个大集合,鉴于其搭建的良好的框架(ringbuffer、tracefs…),各种trace纷纷投奔而来。现在大概分为两大类:tracer、event。tracer。发展出了function tracer、function_graph tracer、irqsoff tracer、...原创 2018-06-15 10:48:28 · 4204 阅读 · 0 评论 -
Linux perf 1.1、perf_event内核框架
为什么有了ftrace又出来一个perf?因为ftrace只管抓trace数据并没有分析,perf在trace数据分析方面做出了很多成果。在trace数据采集方面,perf复用了ftrace的所有插桩点,并且加入了采样法(硬件PMU)。PMU是一种非常重要的数据采集方法,因为它大部分是硬件的,所以可以做到一些软件做不到的事情,获取到一些底层硬件的信息。perf的基本包装模型是这样的,对每一...原创 2018-07-25 12:18:53 · 17151 阅读 · 8 评论 -
Linux perf 1.2、tracepoint events
perf复用了ftrace中trace_event的所有插桩点(即tracepoint),trace数据即可以通过ftrace的通道提供,也可以被包装成perf_event供perf工具使用。可以通过perf list命令来查看系统中的tracpoint event,可以看到和/sys/kernel/debug/tracing/events/路径下的trace_event一致:# si...原创 2018-07-26 15:44:34 · 4412 阅读 · 0 评论 -
Linux perf 2.1、simpleperf
因为perf原生的用户态工具(kerneldir/tools/perf)交叉编译出错较多,用户态源码分析改用android 7.0简化版simpleperf来分析。simpleperf支持完整perf命令中的一些常见子命令。1、命令框架源码入口在system/extras/simpleperf/main.cpp:int main(int argc, char** argv) {...原创 2018-08-03 19:17:07 · 3494 阅读 · 0 评论 -
Linux Perf (目录)
1、内核态解析:1.1、perf_event内核框架1.2、tracepoint events1.3、software events 1.4、hardware events2、用户态解析:2.1、simpleperfperf工作的基础是trace数据的采集和分析,但是当铺天盖地的trace数据采集上来的时候该如何分析?答案是具体数据具体分析。 ...原创 2018-08-03 19:22:49 · 3560 阅读 · 0 评论 -
Linux ftrace 1.1、ring buffer
1、简介ringbuffer是trace框架的一个基础,所有的trace原始数据都是通过ringbuffer记录的。ringbuffer的作用主要有几个:1、存储在内存中,速度非常快,对系统性能的影响降到了最低;2、ring结构,循环写。可以很安全的使用又不浪费内存,能够get到最新的trace信息;但是,难点并不在这。真正的难点是系统会在常规上下文、中断(NMI、IRQ、SOF...原创 2018-05-17 12:08:05 · 5538 阅读 · 0 评论