Linux内核-调试与性能
文章平均质量分 57
生活需要深度
这个作者很懒,什么都没留下…
展开
-
劳德巴赫仿真测试工具Trace32的脚本语言Practice的基本使用(cmm文件)
在每次启动 TRACE32 时,都会覆盖以前的自动启动日志文件,并生成一个新日志文件。块是命令的集合,这些命令始终同时执行。实际上,宏名称总是以一个符号(“&”)开头,后跟一系列字母(az、a-Z)、数字(0-9)和下划线符号(“&”)。双击 PRACTICE 宏(例如 &val1)会将其插入到 TRACE32 命令行中,您可以在其中修改 PRACTICE 宏的参数。双击 PRACTICE 宏(例如 &val1)会将其插入到 TRACE32 命令行中,您可以在其中修改 PRACTICE 宏的参数。原创 2024-04-07 16:04:16 · 422 阅读 · 0 评论 -
劳特巴赫 Trace32 调试使用教程
按照上述流程,此时core0已经成功跑起来了,等个几秒等待其他核运行起来,然后通过cmm文件点击其他核,运行选中的核(如果报错的话,并且不能再正常运行core0,需要将开发板、老特巴赫、USB和trace32t软件全部重置)注意:上诉方式是调试 elf 中的程序方法,如果主板已经烧录好程序,只需要把 elf 中的符号表加载进去即可, 可以在把 elf 文件拖入命令行的时候,在后面加上 /nocode 指令,只加载符号表,不加载程序。再菜单栏中找到下图所示,即可复位,然后点击运行按钮开始运行CPU。原创 2024-04-07 16:03:33 · 344 阅读 · 0 评论 -
Perfetto
Perfetto UI原创 2024-03-06 09:45:53 · 319 阅读 · 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 · 450 阅读 · 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 · 1449 阅读 · 0 评论 -
linux mce的一些相关内容和用户态监控的设计方法
它列出了一个模型,就是用户态daemon,然后设置filter到内核,内核将其监控到的event发给等待的用户进程,使用的方法正是triggers a poll event ,和目前的mce有异曲同工之妙。之所以想起写一点关于mce的东西,倒不是因为遇到mce的异常了,之前遇到过很多mce的异常,内存居多,但没有好好记录下来,写这个是因为参加2018 clk南京会议的一点想法。下面描述的是引发思考的过程,即mce的通知机制,为什么突然想写mce的机制,是因为其实它应用的模式可以解签,原创 2023-03-17 14:32:46 · 278 阅读 · 0 评论 -
PCIe RAS
可校正的错误 :可校正错误可以自动地被硬件识别并被自动的校正或恢复。PCIe错误分为可校正的错误(Correctable)和不可校正的错误(Uncorrectable error), Uncorrectable又分为致命的(Fatal)和非致命的(Nonfatal)。事务层错误主要有:ERCR校检失败,数据损坏,异常的TLP,不支持的请求,Completer Abort,不对应的返回包,返回包超时。另外高级错误源ID寄存器中记录了产生错误的设备的BDF信息,通过该信息我们可以准确的定位到具体的设备。原创 2023-03-17 14:28:42 · 1297 阅读 · 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 · 1105 阅读 · 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 · 1856 阅读 · 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 · 252 阅读 · 0 评论 -
深入ftrace kprobe原理解析
,可能是因为cat的时候,那个进程号对应的进程已经不存在了,第二个是进程PID,触发kprobe的时候记录的。代码位置中的行号是反汇编对应的行号。setup_singlestep() 执行完毕后,程序继续执行保存的被探测点的指令,由于开启了单步调试模式,执行完指令后会继续触发异常,单步执行探测点的指令后,会触发单步异常,进入single_step_handler,调用kprobe_breakpoint_ss_handler,主要任务是恢复执行路径,调用用户注册的post_handler。原创 2023-03-13 15:09:35 · 449 阅读 · 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 · 395 阅读 · 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 · 260 阅读 · 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 · 287 阅读 · 0 评论 -
linux性能工具--ftrace框架
由于内核各个子系统大量使用 event tracing 来 trace 不同的事件,每有一个需要 trace 的事件就实现这么一套函数,这样内核就会存在大量类似的重复的代码,为了避免这样的情况,内核开发者使用一个宏,让宏自动展开成具有相似性的代码。kprobe event就是这样的产物。对于系统,真正的难点在于系统在各种复杂的场景下,例如常规的上下文、中断上下文(NMI/IRQ/SOFTIRQ)等都能很好的trace,如何保证既不影响系统的逻辑,又能处理好相互之间的关系,同时又不影响系统的性能。原创 2023-03-13 14:48:59 · 178 阅读 · 0 评论 -
linux性能工具--ftrace基础篇
function trace是利用gcc编译器在编译时在每个函数的入口地址放置一个probe点,这个probe点会调用一个probe函数(gcc默认调用名为mcount的函数),这样这个 probe函数会对每个执行的内核函数进行跟踪(其实有少数几个内核函数不会被跟踪),并打印log到一个内核中的环形缓存(ring buffer)中,而用户可以通过debugfs来访问这个环形缓存中的内容。在开启ftrace相关的内核配置选项后,内核中已经在一些关键的地方设置了静态探测点,需要使用时,即可查看到相应的信息。原创 2023-03-13 14:47:55 · 398 阅读 · 0 评论 -
backtrace - 线程调用栈
该函数将backtrace函数获取的信息转化为一个字符串数组,参数buffer是backtrace获取的堆栈指针,size是backtrace返回值。该函数获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针数组,参数size用来指定buffer中可以保存多少个void*元素。函数的返回值是实际返回的void*元素个数。当程序出现崩溃等异常时,会接收到内核发送给进程的异常信号,进程接收到异常信号后,可以在处理信号的时候将程序的堆栈信息打印出来,以便于程序调试。2、函数使用注意事项。..原创 2022-09-01 11:22:57 · 2447 阅读 · 3 评论 -
LiteOS调测利器:backtrace函数原理知多少
栈帧从高地址向低地址生长。当程序执行bl跳转指令时,pc中的值为bl指令后的第二条指令的地址,减去一条汇编指令的长度后为bl后第一条指令的地址,即lr值。如果为bl指令地址(特征码0xf000),通过该地址中存储的机器码计算出偏移地址(原理见下图5),从而获得跳转指令目标函数入口地址,如果为blx指令(这里为blx 寄存器n指令,其特征码0x4700),由于目标偏移地址保存在寄存器中,无法通过机器码计算偏移地址,则需要根据被调用帧保存的lr地址推算其所在的函数入口地址,直到入口处的push指令。...原创 2022-09-01 11:25:03 · 637 阅读 · 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 · 1449 阅读 · 0 评论 -
linux crash,系统崩溃 - crash工具介绍
标准的Linux内核不包括kdb,需要从ftp://oss.sgi.com/www/projects/kdb/download/ix86下载对应标准版本内核的kdb补丁,对标准内核打补丁,然后,编译打过补丁的内核代码。在这里,原运行的内核称为系统内核或原内核,新装载运行的内核称为转储捕捉的内核或装载内核或新内核。当定义了插入点后,kprobe的内核部分就会在内存中将插入点附近的代码保存起来,用触发异常的代码替换,当执行到这里的时候异常被触发,回调函数被执行,执行完毕后恢复被保存的正常代码执行。原创 2023-03-08 17:17:32 · 1089 阅读 · 0 评论 -
Linux内核工程导论——内核调试
时间:2022-08-28 21:49:24内核也是一个程序,一般的,调试程序常用的方法有3种:打印信息、断点执行和插入探测点。原创 2023-03-08 17:16:12 · 658 阅读 · 0 评论 -
Linux调试与性能分析
linux性能分析和debug调试原创 2023-03-08 16:22:01 · 424 阅读 · 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 · 459 阅读 · 0 评论