![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核-调试与性能
文章平均质量分 62
生活需要深度
这个作者很懒,什么都没留下…
展开
-
Linux系统日志 - logrotate与syslog
syslogd专门记录非内核的其他设备所产生的日志,当系统的控制权由系统交给init的时候,日志信息的记录由syslogd负责记录。Logrotate是一个日志文件管理工具,用来把旧的日志文件删除,并创建新的日志文件,即日志的转储。syslog工具由一个守护程序组成,接受访问系统的日志信息并且根据/etc/syslog.conf配置文件中的指令处理日志信息。指向信息的指针,一般为程序名,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。.........原创 2022-08-12 14:13:30 · 6541 阅读 · 0 评论 -
Perfetto详细解析
所以下面的文章除了一些网图之外,其他的我会多以 Perfetto 来展示。Choreographer 的引入,主要是配合 Vsync ,给上层 App 的渲染提供一个稳定的 Message 处理的时机,也就是 Vsync 到来的时候 ,系统通过对 Vsync 信号周期的调整,来控制每一帧绘制操作的时机 ,Vsync 信号到来唤醒 Choreographer 来做 App 的绘制操作 ,如果每个 Vsync 周期应用都能渲染完成,给用户的感觉就是非常流畅,这就是引入 Choreographer 的主要作用.原创 2024-06-27 20:55:41 · 773 阅读 · 0 评论 -
Linux内核调试篇——获取内核函数地址的四种方法
在内核调试中,经常需要知道某个函数的地址,或者根据函数地址找到对应的函数,从而进行更深一步的debug。原创 2024-06-26 16:40:50 · 340 阅读 · 0 评论 -
Linux性能 - 硬件
这是程序无法做到的,因为程序没有和数据产生直接的联系,即使是执行不同的数据的程序,但它们的指令的集合依然是一样的,因此无法唯一地标识出这些运行在不同数据集上的程序。而进程则不同,它是程序在某个数据集上的执行(即 进程是程序的一次执行),是一个动态的实体,有自己的生命周期,因创建而产生、因调度而运行、因等待资源或事件而被处于等待状态、因任务完成而被撤销,反映的是一个程序在一定的数据集上运行的全部动态过程。在操作系统看来,线程和进程其实差不多,不同点是线程是迷你的进程,并且进程可以包含多个线程。原创 2024-06-20 10:22:34 · 539 阅读 · 0 评论 -
劳德巴赫仿真测试工具Trace32的脚本语言Practice的基本使用(cmm文件)
在每次启动 TRACE32 时,都会覆盖以前的自动启动日志文件,并生成一个新日志文件。块是命令的集合,这些命令始终同时执行。实际上,宏名称总是以一个符号(“&”)开头,后跟一系列字母(az、a-Z)、数字(0-9)和下划线符号(“&”)。双击 PRACTICE 宏(例如 &val1)会将其插入到 TRACE32 命令行中,您可以在其中修改 PRACTICE 宏的参数。双击 PRACTICE 宏(例如 &val1)会将其插入到 TRACE32 命令行中,您可以在其中修改 PRACTICE 宏的参数。原创 2024-04-07 16:04:16 · 985 阅读 · 1 评论 -
劳特巴赫 Trace32 调试使用教程
按照上述流程,此时core0已经成功跑起来了,等个几秒等待其他核运行起来,然后通过cmm文件点击其他核,运行选中的核(如果报错的话,并且不能再正常运行core0,需要将开发板、老特巴赫、USB和trace32t软件全部重置)注意:上诉方式是调试 elf 中的程序方法,如果主板已经烧录好程序,只需要把 elf 中的符号表加载进去即可, 可以在把 elf 文件拖入命令行的时候,在后面加上 /nocode 指令,只加载符号表,不加载程序。再菜单栏中找到下图所示,即可复位,然后点击运行按钮开始运行CPU。原创 2024-04-07 16:03:33 · 989 阅读 · 0 评论 -
Perfetto
Perfetto UI原创 2024-03-06 09:45:53 · 331 阅读 · 0 评论 -
Linux内核oops panic简析
oops_enter() ---> oops_exit() 为Oops 的处理流程,获取console 的log 级别,并通过 __die() 通过对Oops 感兴趣的模块进行callback,打印模块状态不为 MODULE_STATE_UNFORMED 的模块信息,打印PC、LR、SP、x0 等寄存器信息,打印调用栈信息,等等。当出现 oops,并且如果有源码,可以通过 arm 的 arch64-linux-gnu-objdump 工具看到出错的函数的汇编情况,也可以通过 GDB 工具分析。原创 2023-08-16 16:45:02 · 697 阅读 · 0 评论 -
应用调试之使用strace命令跟踪系统调用
一、安装:1、解压:tar xvf strace-4.5.15.tar.bz2 2、打补丁:cd strace-4.5.15 patch -p1 < ../strace-fix-arm-bad-syscall.patch---是原来的文件,+++是修改后的文件,+是添加的代码,要加参数把第1个斜杠前的内容去掉,才能找到要给哪一个文件打补丁。-p1这里的数字1是从补丁文件里面吧第1个斜杠前的内容去掉,就可以打哪一个文件。3、配置:....原创 2022-04-24 19:48:12 · 1497 阅读 · 0 评论 -
linux mce的一些相关内容和用户态监控的设计方法
它列出了一个模型,就是用户态daemon,然后设置filter到内核,内核将其监控到的event发给等待的用户进程,使用的方法正是triggers a poll event ,和目前的mce有异曲同工之妙。之所以想起写一点关于mce的东西,倒不是因为遇到mce的异常了,之前遇到过很多mce的异常,内存居多,但没有好好记录下来,写这个是因为参加2018 clk南京会议的一点想法。下面描述的是引发思考的过程,即mce的通知机制,为什么突然想写mce的机制,是因为其实它应用的模式可以解签,原创 2023-03-17 14:32:46 · 305 阅读 · 0 评论 -
PCIe RAS
可校正的错误 :可校正错误可以自动地被硬件识别并被自动的校正或恢复。PCIe错误分为可校正的错误(Correctable)和不可校正的错误(Uncorrectable error), Uncorrectable又分为致命的(Fatal)和非致命的(Nonfatal)。事务层错误主要有:ERCR校检失败,数据损坏,异常的TLP,不支持的请求,Completer Abort,不对应的返回包,返回包超时。另外高级错误源ID寄存器中记录了产生错误的设备的BDF信息,通过该信息我们可以准确的定位到具体的设备。原创 2023-03-17 14:28:42 · 1494 阅读 · 1 评论 -
Linux内核中的panic
在循环中,它重置非屏蔽中断(NMI),然后定期调用一个名为架构依赖的panic_blink函数;在x86上,该事件会引起键盘LED会闪烁,驱动drivers/input/serio/i8042.c:i8042_panic_blink().原文链接:https://blog.csdn.net/WANGYONGZIXUE/article/details/127579722。原子的 注册函数,实际上对spin_lock_irqsave/spin_unlock_irqsave封装。原创 2023-03-17 14:25:28 · 1152 阅读 · 0 评论 -
PCIE AER Linux 驱动详解 - ERR EXCEPTION
因为硬件可以纠正可纠正的错误无需任何软件干预,如果有发生时,在 PCI Express 根端口收到的消息变为错误类型和代理 ID, PCI Express AER 驱动程序首先解码此错误。为避免与 BIOS 冲突,同时处理 PCI Express 错误,PCI Express AER驱动程序必须请求 BIOS 以获得 PCI 的所有权,通过 ACPI _OSC 方法,在 PCI Express 规范和 ACPI 规范中描述的。虽然硬件有能力纠正和减少可纠正的错误,但是可纠正的错误可能对系统有性能的影响。原创 2023-03-17 14:05:44 · 2123 阅读 · 1 评论 -
深入ftrace uprobe原理和功能介绍
我们以ubuntu为试验环境,使用uprobe一般都是编写内核驱动,在模块中定义uprobe_consumer ,然后调用uprobe的API(uprobe_register)来进行注册uprobe。regiseter_uprobe_event: 将 probe 添加到全局列表中,并创建对应的 uprobe debugfs 目录,即上文示例中的 p_test_0x115a。本章的我们来学习uprobe ,顾名思义,相对于内核函数/地址的监控,主要用于用户态函数/地址的监控。原创 2023-03-13 15:08:28 · 281 阅读 · 0 评论 -
深入ftrace kprobe原理解析
,可能是因为cat的时候,那个进程号对应的进程已经不存在了,第二个是进程PID,触发kprobe的时候记录的。代码位置中的行号是反汇编对应的行号。setup_singlestep() 执行完毕后,程序继续执行保存的被探测点的指令,由于开启了单步调试模式,执行完指令后会继续触发异常,单步执行探测点的指令后,会触发单步异常,进入single_step_handler,调用kprobe_breakpoint_ss_handler,主要任务是恢复执行路径,调用用户注册的post_handler。原创 2023-03-13 15:09:35 · 512 阅读 · 0 评论 -
深入ftrace function graph原理
此函数在文件关闭时执行,把当前的iter->hash移动到旧的hash(ops->func_hash->filter_hash),在移动过程中,对比两个hash中的目标函数,按需更新每个函数的rec->flags的计数以及相关功能flags,后以FTRACE_UPDATE_CALLS 命令执行 ftrace_run_update_code(),此函数会检测每个函数 rec->flags 的状态,执行 FTRACE_UPDATE_MAKE_CALL 操作,将当前函数入口替换为 ftrace_caller。原创 2023-03-13 14:53:19 · 464 阅读 · 0 评论 -
深入ftrace function原理
这种是静态的ftrace,ftrace是有一个全局的ftrace_trace_function变量,每当我们设置了一个trace,这个ftrace_trace_function就指向我们设置的trace的回调函数,如果ftrace_trace_function不等于默认的桩函数ftrace_stub,则调用调用function tracer的回调函数:ftrace_trace_function()第二步,blk_update_request中的nop被替换为ftrace_caller。原创 2023-03-13 14:50:06 · 298 阅读 · 0 评论 -
linux性能工具--ftrace使用
如果要看vfs_read()一个具体的调用过程,除了使用上一节的trace-cmd report命令,还可以使用kernelshark图形化的形式来查看,可以在板子上使用trace-cmd record 记录事件,把得到的trace.data放到linux 桌面系统,用kernelshark打开,看到图形化的信息。function,函数调用追踪器, 跟踪函数调用,默认跟踪所有函数,如果设置set_ftrace_filter, 则跟踪过滤的函数,可以看出哪个函数何时调用。原创 2023-03-13 14:48:07 · 305 阅读 · 0 评论 -
linux性能工具--ftrace框架
由于内核各个子系统大量使用 event tracing 来 trace 不同的事件,每有一个需要 trace 的事件就实现这么一套函数,这样内核就会存在大量类似的重复的代码,为了避免这样的情况,内核开发者使用一个宏,让宏自动展开成具有相似性的代码。kprobe event就是这样的产物。对于系统,真正的难点在于系统在各种复杂的场景下,例如常规的上下文、中断上下文(NMI/IRQ/SOFTIRQ)等都能很好的trace,如何保证既不影响系统的逻辑,又能处理好相互之间的关系,同时又不影响系统的性能。原创 2023-03-13 14:48:59 · 194 阅读 · 0 评论 -
linux性能工具--ftrace基础篇
function trace是利用gcc编译器在编译时在每个函数的入口地址放置一个probe点,这个probe点会调用一个probe函数(gcc默认调用名为mcount的函数),这样这个 probe函数会对每个执行的内核函数进行跟踪(其实有少数几个内核函数不会被跟踪),并打印log到一个内核中的环形缓存(ring buffer)中,而用户可以通过debugfs来访问这个环形缓存中的内容。在开启ftrace相关的内核配置选项后,内核中已经在一些关键的地方设置了静态探测点,需要使用时,即可查看到相应的信息。原创 2023-03-13 14:47:55 · 435 阅读 · 0 评论 -
backtrace - 线程调用栈
该函数将backtrace函数获取的信息转化为一个字符串数组,参数buffer是backtrace获取的堆栈指针,size是backtrace返回值。该函数获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针数组,参数size用来指定buffer中可以保存多少个void*元素。函数的返回值是实际返回的void*元素个数。当程序出现崩溃等异常时,会接收到内核发送给进程的异常信号,进程接收到异常信号后,可以在处理信号的时候将程序的堆栈信息打印出来,以便于程序调试。2、函数使用注意事项。..原创 2022-09-01 11:22:57 · 2644 阅读 · 3 评论 -
LiteOS调测利器:backtrace函数原理知多少
栈帧从高地址向低地址生长。当程序执行bl跳转指令时,pc中的值为bl指令后的第二条指令的地址,减去一条汇编指令的长度后为bl后第一条指令的地址,即lr值。如果为bl指令地址(特征码0xf000),通过该地址中存储的机器码计算出偏移地址(原理见下图5),从而获得跳转指令目标函数入口地址,如果为blx指令(这里为blx 寄存器n指令,其特征码0x4700),由于目标偏移地址保存在寄存器中,无法通过机器码计算偏移地址,则需要根据被调用帧保存的lr地址推算其所在的函数入口地址,直到入口处的push指令。...原创 2022-09-01 11:25:03 · 704 阅读 · 0 评论 -
perf - linux系统级性能分析工具的介绍与使用
perf kmem用于跟踪测量内核slab分配器事件信息。比如内存分配/释放等。可以用来研究程序在哪里分配了大量内存,或者在什么地方产生碎片之类的和内存管理相关的问题。perf kmem和perf lock实际上都是perf tracepoint的子类,等同于perf record -e kmem:*和perf record -e lock:*。但是这些工具在内部队员是数据进行了慧聪和分析,因此统计报表更具可读性。perf kmem record:抓取命令的内核slab分配器事件。原创 2023-03-08 17:49:29 · 1585 阅读 · 0 评论 -
linux crash,系统崩溃 - crash工具介绍
标准的Linux内核不包括kdb,需要从ftp://oss.sgi.com/www/projects/kdb/download/ix86下载对应标准版本内核的kdb补丁,对标准内核打补丁,然后,编译打过补丁的内核代码。在这里,原运行的内核称为系统内核或原内核,新装载运行的内核称为转储捕捉的内核或装载内核或新内核。当定义了插入点后,kprobe的内核部分就会在内存中将插入点附近的代码保存起来,用触发异常的代码替换,当执行到这里的时候异常被触发,回调函数被执行,执行完毕后恢复被保存的正常代码执行。原创 2023-03-08 17:17:32 · 1138 阅读 · 0 评论 -
Linux内核工程导论——内核调试
时间:2022-08-28 21:49:24内核也是一个程序,一般的,调试程序常用的方法有3种:打印信息、断点执行和插入探测点。原创 2023-03-08 17:16:12 · 692 阅读 · 0 评论 -
kdump实现原理
但是每个应用的用户空间太大了,不可能都抓取出来,一般只需要根据/proc/xxx/maps的地址段dump就好,所以这么多dump数据还需要有格式,而在linux上elf大行其道,我们通常的core dump是elf的,他会为每个/proc/xxx/maps中的每个段都生成一个program tabler header,标记了虚拟地址和其在dump文件中的偏移,这样就能借助于gdb工具进行分析。2.可以通过kexec系统调用,将第二个内核和initrd,vmcore信息,启动参数等传递给第一个内核。原创 2023-03-07 18:21:39 · 548 阅读 · 0 评论 -
Linux内核调试与性能概述
(进程控制块)资源:虽然进程退出后,内核会释放该进程所有的资源,包括打开的文件和占用的内存等,但仍然会为其保留一定的信息,主要是进程控制块PCB的信息,如进程号、退出状态、运行时间等。综上所述,进程退出后,操作系统会回收大部分占用的资源,但父进程有责任通过调用wait()或waitpid()函数来显式回收子进程的PCB资源和确保系统资源的正确释放。内存资源:进程占用的内存空间,包括栈、堆、代码段中的机器指令和数据段中的全局变量等,都会被操作系统回收并标记为可用,以便其他进程可以使用。原创 2024-05-16 19:53:04 · 250 阅读 · 0 评论