【Linux 命令】内核、驱动调试手段总结

在这里插入图片描述

文章目录

  • 1. printk
  • 2. strace
  • 3. Itrace
  • 4. ptrace
  • 5. ftrace
  • 6. 动态打印
  • 7. perf
  • 8. devmem
  • 9. demsg
  • 参考:


1. printk

**printk()**是 Linux 内核中最广为人知的函数之一。它是我们打印消息的标准工具,通常也是追踪和调试的最基本方法。

虽然 printk() 是基于 printf(3) 的,但在功能上仍有一些不同:

  • printk() 消息可以指定日志级别;
  • 格式字符串虽然与C99基本兼容,但并不遵循完全相同的规范。它有一些扩展和一些限制(没有 %n 或浮点转换指定符)。

所有的 printk() 消息都会被打印到内核日志缓冲区,这是一个通过 /dev/kmsg 输出到用户空间的环形缓冲区。读取它的通常方法是使用 dmesg 。

printk() 的用法通常是这样的:

printk(KERN_INFO "Message: %s\n", arg);

其中 KERN_INFO 是日志级别(注意,它与格式字符串连在一起,日志级别不是一个单独的参数)。可用的日志级别是:
在这里插入图片描述
日志级别指定了一条消息的重要性。内核根据日志级别和当前 console_loglevel (一个内核变量)决 定是否立即显示消息(将其打印到当前控制台)。如果消息的优先级比 console_loglevel 高(日志级 别值较低),消息将被打印到控制台。

如果省略了日志级别,则以 KERN_DEFAULT 级别打印消息。

你可以用以下方法检查当前的 console_loglevel
在这里插入图片描述

要改变当前的 console_loglevel,只需在 /proc/sys/kernel/printk 中写入所需的 级别。例如,要打印所有的消息到控制台上:
在这里插入图片描述
或者,使用另一种方式:
在这里插入图片描述


作为 printk() 的替代方案,也可以使用 pr_*() 别名来记录日志。这个系列的宏在宏名中嵌入了日志级别。例如:

pr_info("Info message no. %d\n", msg_num);

打印 KERN_INFO 消息。

除了比等效的 printk() 调用更简洁之外,它们还可以通过 pr_fmt() 宏为格式字符串使用一个通用的定义。例如,在源文件的顶部(在任何 #include 指令之前)定义这样的内容:

#define pr_fmt(fmt) "%s:%s: " fmt, KBUILD_MODNAME, __func__

会在该文件中的每一条 pr_*() 消息前加上发起该消息的模块和函数名称。

为了调试,还有两个有条件编译的宏: pr_debug()pr_devel(),除非定义了 DEBUG (或者在pr_debug()的情况下定义了 CONFIG_DYNAMIC_DEBUG ),否则它们不会被编译。


2. strace

strace常用来跟踪进程执行时的系统调用和接收所接收的信号,在Linux中,进程不能直接访问硬件设备,当进程需要访问硬件设备的时候(如读取磁盘,接收网络数据的时候),必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
作者:荷叶的莲藕
链接:https://www.jianshu.com/p/6b39a5dacea0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


strace的特性:

  • 分析一个已经运行的进程
    在这里插入图片描述

  • 打印与文件描述符相关联的路径和更多信息
    TBD.

  • 按系统调用类型筛选
    在这里插入图片描述

  • 仅追踪访问指定路径的系统调用
    在这里插入图片描述

  • 对从文件描述符读取或写入的所有数据进行完整的十六进制和ASCII转储
    TBD.

  • 执行系统调用故障注入
    TBD.

  • 计算每个系统调用的时间、调用次数和错误次数
    在这里插入图片描述


常用参数:

-c 统计每一系统调用的所执行的时间,次数和出错的次数等。 
-d 输出 strace 关于标准错误的调试信息。
-f 跟踪由 fork 调用所产生的子进程。 
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的 filename.pid 中,pid 是各进程的进程号。 
-F 尝试跟踪 vfork 调用;在 -f 时,vfork不被跟踪。
-h 输出简要的帮助信息。
-i 输出系统调用的入口指针。 
-q 禁止输出关于脱离的消息。
-r 打印出相对时间关于,每一个系统调用。 
-t 在输出中的每一行前加上时间信息。
-tt 在输出中的每一行前加上时间信息,微秒级。 
-ttt 微秒级输出,以秒了表示时间。
-T 显示每一调用所耗的时间。 
-v 输出所有的系统调用。一些调用关于环境变量、状态、输入输出等调用由于使用频繁,默认不输出。 
-V 输出 strace 的版本信息。
-x 以十六进制形式输出非标准字符串。 
-xx 所有字符串以十六进制形式输出。
-a column 
设置返回值的输出位置,默认为40-e expr 
指定一个表达式,用来控制如何跟踪,格式如下: 
[qualifier=][!]value1[,value2]... 
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一。value是用来限定的符号或数字。默认的 qualifier 是 trace。感叹号是否定符号。例如: 
-eopen 等价于 -e trace=open,表示只跟踪 open 调用。而-etrace!=open表示跟踪除了open 以外的其他调用。有两个特殊的符号 all 和 none。 
注意有些 shell 使用!来执行历史记录里的命令,所以要使用\\。 
-e trace=set 
只跟踪指定的系统调用。例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用。默认的为set=all。 
-e trace=file 
只跟踪有关文件操作的系统调用。 
-e trace=process 
只跟踪有关进程控制的系统调用。
-e trace=network 
跟踪与网络有关的所有系统调用。
-e strace=signal 
跟踪所有与系统信号有关的系统调用。 
-e trace=ipc 
跟踪所有与进程通讯有关的系统调用。
-e abbrev=set 
设定 strace 输出的系统调用的结果集。-v 等与 abbrev=none。默认为abbrev=all。 
-e raw=set 
将指定的系统调用的参数以十六进制显示。 
-e signal=set 
指定跟踪的系统信号。默认为all。如signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号。 
-e read=set 
输出从指定文件中读出的数据。例如: 
-e read=35 
-e write=set 
输出写入到指定文件中的数据。 
-o filename 
将strace的输出写入文件filename。
-p pid 
跟踪指定的进程pid。
-s strsize 
指定输出的字符串的最大长度。默认为32.文件名一直全部输出。 
-u username 
以 username 的UID和GID执行被跟踪的命令。

作者:荷叶的莲藕
链接:https://www.jianshu.com/p/6b39a5dacea0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



3. Itrace

TBD.


4. ptrace

TBD.


5. ftrace

TBD.


6. 动态打印

TBD.


7. perf

perf 命令也被称为 perf_events
perf 是一个功能强大的工具:它可以用来测量 CPU 性能计数器、跟踪点、内核探针(kprobes)和用户空间探针(uprobes,即动态跟踪)。它可以进行轻量级的性能分析。这个工具包含在 Linux 内核的 tools/perf 目录下,并且经常得到更新和增强。

perf 最初是作为在 Linux 中使用性能计数器子系统的工具而出现的,之后得到了各种增强以添加跟踪能力。

性能计数器是 CPU 的硬件寄存器,用于计数硬件事件,如执行的指令数、遭遇的缓存未命中数或分支预测错误数。它们是应用程序性能分析的基础,用于追踪动态控制流并识别热点。perf 提供了对硬件特定能力的丰富和通用的抽象。其中,它提供了按任务、按 CPU 和按工作负载的计数器,在这些计数器之上的采样,以及源代码事件注释。

跟踪点是放置在代码逻辑位置上的仪器化点,如系统调用、TCP/IP事件、文件系统操作等。当不使用这些跟踪点时,它们的开销可以忽略不计,并且可以通过 perf 命令启用它们以收集信息,包括时间戳和堆栈跟踪。perf 还可以使用 kprobes 和 uprobes 框架动态创建跟踪点,用于内核和用户空间的动态跟踪。这些可能性是无穷的。

用户空间的 perf 命令提供了一个简单易用的接口,包含如下命令:

  • perf stat:获取事件计数。当我们接到一个性能优化任务时,最好采用自顶向下的策略。先整体看看该程序运行时各种统计事件的汇总数据,再针对某些方向深入处理细节,而不要立即深入处理琐碎的细节,这样可能会一叶障目。有些程序运行得慢是因为计算量太大,其多数时间在使用 CPU 进行计算,这类程序叫作 CPU-Boud型;而有些程序运行得慢是因为过多的 I/O,这时其 CPU 利用率应该不高,这类程序叫作 I/O-Bound 型。对 CPU-Bound 型程序的调优和 I/O-Bound 型的调优是不同的。
    • - a:显示所有CPU上的统计信息
    • - c:显示指定CPU上的统计信息
    • - e:指定要显示的事件
    • - p:指定要显示的进程ID
  • perf record:记录事件以供后续perf report分析、报告
    • - e:选择一个事件,可以是硬件事件也可以是软件事件
    • - a:全系统范围的数据采集
    • - p:指定一个进程的 ID 来采集特定进程的数据
    • - o:指定要写入采集数据的数据文件
    • - g:使能函数调用图功能
    • - C:只采集某个 CPU 的数据
  • perf report:按进程、函数等分解,perf revord记录的事件数据
    • - i:导入的数据文件名称,默认为perf.data
    • - g:生成函数调用关系图
    • – sort:分类统计信息,如PID、COMM、CPU等
  • perf annotate:用事件计数注释汇编或源代码
  • perf top:查看实时事件计数,类似 Linux 系统中的 top 命令,可以实时分析系统性能瓶颈。
    • - e:指定要分析的性能事件
    • - p:仅分析目标进程
    • - k:指定带符号表信息的内核映射路径
    • - K:不显示内核或者内核模块的符号
    • - U:不显示属于用户态程序的符号
    • - g:显示函数调用关系图
  • perf bench:运行不同的内核微基准测试

事件(event)来源:

  • Hardware event:由PMU产生的事件,如L1缓存命中等。
  • Software event:由内核产生的事件,如进程切换等。
  • Tracepoints event:由内核静态跟踪点所触发的事件。

在kernel中添加perf编译:
make menuconfig
General setup —>
Kernel Performance Events And Counters —>
[*] Debug: use vmalloc to back perf mmap() buffers


8. devmem

TBD.


9. demsg

TBD.


参考:

【1】使用printk记录消息
【2】Linux内核基础篇——printk调试
【3】strace官网
【4】Linux神器strace的使用方法及实践
【5】strace命令详解
【6】Strace使用指南
【7】perf: Linux profiling with performance counters
【8】CoreSight - Perf
【9】如何使用perf进行性能优化
【10】Linux内核,perf性能分析工具应用实战,FlameGraph(火焰图生成)
【11】嵌入式设备交叉编译perf性能分析工具
【12】Linux内核,perf性能分析工具应用实战,FlameGraph(火焰图生成)
【13】如何给嵌入式Linux构建一个支持多特性的perf
【14】学会使用perf性能分析工具(含移植到arm-linux开发板)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528301.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable diffusion 初学者指南

1. Stable diffusion 初学者指南 想掌握Stable Diffusion AI技术吗? 这份初学者指南专为完全没接触过Stable Diffusion或任何AI图像生成器的新手设计。跟随本指南,你将了解Stable Diffusion的基本情况,并获得一些实用的入门技巧。 什么是S…

JavaWeb流行框架(代码案例)

Struts2基础 通过Struts2将请求转发到指定JSP页面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://w…

Codeforces Round 938 (Div. 3) (A~E)

Codeforces Round 938 (Div. 3) (A~E) 目录&#xff1a;A B C D E A题&#xff1a;Yogurt Sale 标签: 数学&#xff08;math&#xff09; 题目大意 酸奶价格&#xff0c; a 元一份&#xff0c;b元两份n问&#xff1a;买n份最少多少钱 思路 a元一份&#xff0c;b元两份&#…

js获取上周本周下周的日期(附Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋 前言 现在的时间点是&#xff1a;2024-04-08&#xff0c;对应的日期如下&#xff08;上周、这周、下周&#xff09; 1. 基本知识 讲述Demo之前&#xff0c;先补充一些基础知识 JavaScript 中的 Date 对象是用于处理日期和时间的对象。它…

【ensp】VLAN间通信的解决办法

VLAN间通信简介 VLAN间三层通信是指在VLAN网络中&#xff0c;不同VLAN之间进行通信的过程。 我们知道VLAN是虚拟局域网&#xff0c;在一个局域网内我们是通过Mac地址进行通信&#xff0c;在局域网与局域网之间通过IP地址来通信&#xff0c;大致过程如下&#xff1a; 主机在发…

【SERVERLESS】搭建ServerLess服务

目录 一、前言 二、什么是ServerLess? 三、ServerLess技术选型 四、ServerLess基础服务搭建 Mac安装示例&#xff1a; Windows安装说明&#xff1a; 五、生成ServerLess应用 六、ServerLess部署 验证并访问函数应用 七、ServerLess进阶演示 八、ServerLess最后总结 …

芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第三集】芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖高效AsDDet检测头组合改进,适用于 YOLOv8 …

免费ai写作软件有哪些?分享10个给你 #媒体#学习#媒体

你是否因为写作困顿而感到沮丧&#xff1f;是不是希望能够找到一个能给你提供无限灵感和提高创作效率的利器&#xff1f;AI写作助手就是你的绝佳选择&#xff01;现在我向大家推荐几款好用的AI写作助手&#xff0c;它们将让你的创作之旅更加流畅、富有创意。 1.飞鸟写作 这是…

超详细解读Transformer框架

Transformer是由谷歌大脑2017年在论文《Attention is All You Need》中提出的一种序列到序列(Seq2Seq)模型。自提出伊始&#xff0c;该模型便在NLP和CV界大杀四方&#xff0c;多次达到SOTA效果。NLP领域中&#xff0c;我们所熟知的BERT和GPT就是从Transformer中衍生出来的预训练…

【云计算】云网络产品体系概述

云网络产品体系概述 在介绍云网络产品体系前&#xff0c;先介绍几个与云计算相关的基础概念。 阿里云在基础设施层面分为 地域 和 可用区 两层&#xff0c;关系如下图所示。在一个地域内有多个可用区&#xff0c;每个地域完全独立&#xff0c;每个可用区完全隔离&#xff0c;同…

咸鱼之王_手游_开服搭建架设_内购修复无bug运营版

视频演示 咸鱼之王_手游_开服 游戏管理后台界面 源码获取在文章末尾 源码获取在文章末尾 源码获取在文章末尾 或者直接下面 https://githubs.xyz/y28.html 1.安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &…

Leetcode C语言习题

Leetcode习题27&#xff1a;移除元素 题目&#xff1a; 说明&#xff1a; 示例&#xff1a; 题解&#xff1a; 方法一&#xff1a;&#xff08;开辟额外的数组空间&#xff09; 我们可以创建一个新的数组&#xff0c;然后用循环来遍历原数组&#xff0c;将原数组中不为 val…

29.WEB渗透测试-数据传输与加解密(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;28.WEB渗透测试-数据传输与加解密&#xff08;2&#xff09; md5解密网站&#xff1a;ht…

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…

高创新 | [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测

高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测 目录 高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现 [24年新算…

实现 jwt 鉴权- SpringBoot + 微服务

目录 项目结构 主要步骤 auth-service里&#xff1a; 1. 配置 pom.xml 依赖 2. 实现HandlerInterceptor 接口的 preHandle 函数 3. 实现 WebMvcConfigurer 的 addInterceptors 接口 4. 生成 token 和验证 token 5. 登录接口示例 user-service 里&#xff1a; 6. 实现拦…

Netty NioEventLoop详解

文章目录 前言类图主要功能NioEventLoop如何实现事件循环NioEventLoop如何处理多路复用Netty如何管理Channel和Selector管理Channel管理Selector注意事项 前言 Netty通过事件循环机制(EventLoop)处理IO事件和异步任务&#xff0c;简单来说&#xff0c;就是通过一个死循环&…

信息泄露漏洞的JS整改方案

引言 &#x1f6e1;️ 日常工作中&#xff0c;我们经常会面临线上环境被第三方安全厂商扫描出JS信息泄露漏洞的情况&#xff0c;这给我们的系统安全带来了潜在威胁。但幸运的是&#xff0c;对于这类漏洞的整改并不复杂。本文将介绍几种可行的整改方法&#xff0c;以及其中一种…

【C语言】:枚举和联合体

这里写自定义目录标题 1、枚举1.1 枚举类型的声明1.2 枚举类型的优点1.3 枚举类型的使用 2、联合体&#xff08;共用体&#xff09;2.1 联合体类型的声明2.2 联合体的特点2.3联合体大小的计算 1、枚举 1.1 枚举类型的声明 枚举顾名思义就是⼀⼀列举&#xff0c;把可能的取值⼀…

Tomcat以服务方式启动,无法访问网络共享目录问题

关于“Tomcat以服务方式启动&#xff0c;无法访问网络共享目录问题”解决方式如下&#xff1a; 1、通过doc命令【services.msc】打开本地服务找到&#xff0c;找到tomcat服务所在位置 2、右键打开Tomcat服务的属性 3、选择 登陆选项卡 4、选择“此账户”选项&#xff0c;并…