![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Debug
文章平均质量分 89
主要介绍Linux调试的一些工具和思路
HZero.chen
随风潜入夜,润物细无声
展开
-
crash处理core文件
目录1.全局变量解析2.局部变量的解析2.1 位于栈中的局部变量2.1.1 在上级函数中通过该变量与堆栈的关系解析2.2.2 在本级或下级函数中通过该变量与堆栈的关系解析2.2 位于寄存器中的局部变量本文转自 https://www.cnblogs.com/hehheai/p/6513699.html本文主要讲述了如何根据crash dump来查找某个特定函数局部变量值的方法,总结起来包括如下几种方法:位于栈中的局部变量的解析(1)在上级函数中通过该变量与堆栈的关系解析如果以函数参数传递给下级转载 2022-04-02 12:46:44 · 600 阅读 · 2 评论 -
tracepoint简介
1. tracepoint原理tracepoint是预先在函数的插入点中插桩,当执行到函数的插入点,则执行插桩函数,进而触发与插入点预先绑定的probe函数,probe函数可以是一个或者多个,probe函数可以定义为任意的行为,从而可以起到对函数内部观测的租用。2. 使用tracepoint的步骤2.1 DECLARE_TRACE需要在头文件中通过DECLARE_TRACE宏声明,DECLARE_TRACE定义如下:#define DECLARE_TRACE(name, proto, args)原创 2022-03-14 14:37:12 · 3711 阅读 · 2 评论 -
Kprobe-based Event Tracing
前言本文是对内核文档 《Kprobe-based Event Tracing》的翻译和整理。kprobe可以在except those with __kprobes/nokprobe_inline annotation and those marked NOKPROBE_SYMBOL的任何函数设置trace event。使用前需要打开内核选项:CONFIG_KPROBE_EVENTS=y.可以通过/sys/kernel/debug/tracing/kprobe_events来增加kprobe跟踪点,翻译 2022-01-04 14:43:04 · 528 阅读 · 0 评论 -
trace系列0 - 概述
1.前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。这是整个系列文章的第一篇,本篇主要解决如下几个问题:ftrace是什么?ftrace框架包含哪些tracer?这些tracer的基本使用方法有哪些?kernel版本:5.10平台:arm642. ftrace是什么?ftrace是一个内核跟踪工具,旨在帮助系统开发人员和设计人员了解内核内部的情况。从2008年由Steven Rostedt 开发并在合并到2.6.27主线内核,原创 2021-12-31 15:31:35 · 1377 阅读 · 0 评论 -
使用stacktrace查看函数调用栈
前言在阅读内核代码的时候,经常需要查看函数调用栈,来帮助理解代码的调用流程。ftrace就提供了这样一种强大的功能,它可以把调用的每个函数都显示出来,同时也统计了每个函数花费的时间。但是有时候我们并不需要这么详细的信息,我们只关注某个函数的基本函数调用栈就可以了,此时可以采用stack trace进行查看。编译配置开启如下的编译配置项CONFIG_TRACING=yCONFIG_TRACING_SUPPORT=yCONFIG_FTRACE=yCONFIG_GENERIC_TRACER=yC原创 2020-09-24 17:12:28 · 2445 阅读 · 0 评论 -
Tracing event
1.前言本文档都是对内核文档《Event Tracing》的翻译和整理。Tracing event实际是建立在Trace points基础之上的,使用Tracing event不用像tracing point那样需要自己定义probe函数,而且这些probe函数往往要通过模块的方式进行定义,然后加载,而Tracing event提供了TRACE_EVENT宏,可以通过复杂宏帮助定义统一格式的probe函数,而Tracing event需要用户指定trace 信息以何种格式存放到ring buffer中,翻译 2021-11-09 15:29:22 · 782 阅读 · 0 评论 -
trace系列0 - ftrace初始化
void __init trace_event_init(void){ event_trace_memsetup(); init_ftrace_syscalls(); event_trace_enable(); event_trace_init_fields();}static __init int event_trace_enable(void){ struct trace_array *tr = top_trace原创 2021-11-09 14:51:17 · 1352 阅读 · 0 评论 -
trace系列3 - trace event学习笔记
0.前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。通过观察钩子函数的创建过程以及替换过程,理解trace的原理。本文同样以blk_update_request函数为例进行说明trace event的原理。1. TRACE_EVENT宏第一次定义(include/linux/tracepoint.h)#define TRACE_EVENT(name, proto, args, struct, assign, print) \原创 2021-11-04 16:44:50 · 3938 阅读 · 2 评论 -
trace系列5 - kretprobe学习笔记
0.前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。通过观察钩子函数的创建过程以及替换过程,理解trace的原理。本文同样以blk_update_request函数为例进行说明kprobe的工作原理,此处的kretprobe是基于trace event来实现,同时使用了ftrace的框架。1. kprobe的总体原理2. kretprobe领域模型同 trace系列3 - kretprobe学习笔记3. kretprobe创建在执行如下原创 2021-11-01 17:13:41 · 1216 阅读 · 0 评论 -
trace系列4 - kprobe学习笔记
1.前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》视频课程在aarch64上的实践。通过观察钩子函数的创建过程以及替换过程,理解trace的原理。本文同样以blk_update_request函数为例进行说明function trace kprobe的工作原理,此处的kprobe是基于function trace来实现。kernel版本:5.10平台:arm642. function trace钩子函数替换过程2.1 编译阶段同Linux ftrace学习笔记中编原创 2021-10-30 16:10:50 · 2673 阅读 · 3 评论 -
kernel相关参数文档说明
kernel的如下目录主要包含了kernel以及其他的系统参数,对于这些参数的意义,有时候我们不太了解内核文档目录下有如下文档,与上面的目录节点形成对应:通过这个文档,就可以大致了解系统的参数...原创 2021-10-16 09:03:56 · 2345 阅读 · 0 评论 -
trace系列2 - function graph trace学习笔记
1.前言2. function graph trace钩子函数替换过程3. function graph trace执行过程(gdb) disassemble ftrace_callerDump of assembler code for function ftrace_caller: 0xffff80001002c370 <+0>: stp x29, x30, [sp,#-16]! 0xffff80001002c374 <+4>: mov原创 2021-10-12 22:59:50 · 1209 阅读 · 0 评论 -
trace系列1 - function trace学习笔记
目录前言编译阶段|- -未开启ftrace|- -开启ftrace链接阶段|- -未开启ftrace|- -开启ftrace运行阶段| - -ftrace_init执行后钩子函数的构造过程参考文档前言本文主要是根据阅码场 《Linux内核tracers的实现原理与应用》在aarch64上的实践。通过观察钩子函数的创建过程以及替换过程,理解trace的原理。本文同样以blk_update_request函数为例进行说明。kernel版本:5.10平台:arm64编译阶段|- -未开启ftrace原创 2021-07-01 16:14:01 · 1592 阅读 · 0 评论 -
GDB常用命令
注:内核编译的时候需要注意修改Makefile为O1,否则会乱序,不利于调试显示效果|- -set print address on打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的|- -show print address查看当前地址显示选项是否打开。|- -set print array on打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。|- -set print array off关闭.原创 2021-07-01 13:49:07 · 860 阅读 · 0 评论 -
使用perf工具查看函数调用栈
前言perf是一款强大的性能分析工具,本文只是对其查看函数调用栈的用法做一简要说明,后续再逐渐对其它功能进行补充。编译以arm64, kernel4.19为例,在linux源码的tools目录下执行:make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 perf LDFLAGS=-static V=1编译后会在linux/tools/perf/目录下生成perf工具测试perf record -a -g dd if=/dev/testb_a of原创 2020-10-26 14:55:53 · 4227 阅读 · 2 评论 -
perf的基本使用方法
前言Perf 是用来进行软件性能分析的工具,可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计,用来分析内核和应用程序的性能。perf可以完成如下的性能分析计算每个时钟周期内的指令数 进行函数级别的采样了解性能瓶颈 替代strace添加动态内核 probe 点做 benchmark 衡量调度器的好坏perf性能分析需要了解如下背景知识cache 流水线超标量体系结构乱序执行分支预测PMU计数tracepointperf的基本使用方法以下面的实翻译 2020-10-28 15:17:27 · 30663 阅读 · 0 评论 -
fio测试环境搭建
下载代码fio下载地址:http://brick.kernel.dk/snaps/fio-2.1.10.tar.gzlibaio下载地址:https://github.com/crossbuild/libaio.git编译内核需要开启 CONFIG_SYSVIPC=y配置项编译libaiomake CC=aarch64-linux-gnu-gcc AR=aarch64-linux-gnu-ar RANLIB=aarch64-linux-gnu-ranlib将libaio.a拷原创 2020-10-26 15:26:13 · 2054 阅读 · 0 评论