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

在这里插入图片描述

文章目录

  • 1. printk
  • 2. strace
  • 3. ltrace
  • 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. ltrace

ltrace是 Linux 中的一种动态追踪程序库调用的工具,其主要功能是帮助开发者跟踪程序在运行时所调用的库函数。它可以像 strace 一样捕捉动态链接的函数调用,并且能够记录函数的参数、返回值、执行时间和错误信息等信息,从而帮助开发者更好地了解内核代码的执行情况并找出问题的根本原因。

在使用 ltrace 命令进行跟踪时,其输出信息可能非常庞大,可能包含大量不必要的信息。为了使数据更加可读和有用,开发者可以使用过滤器来过滤输出。此外,虽然 ltrace 与 strace 使用的技术大体相同,但在对支持 fork 和 clone 方面,ltrace 的功能不如 strace。

在一些无法调试的环境上检查问题时,也可以使用 ltrace 命令来查看程序是否按预期执行。例如,如果要跟踪ls命令的库函数调用,可以使用命令“ltrace ls”,这将输出ls命令使用的库函数的调用信息。

总的来说,ltrace是一个强大的内核调试工具,它能帮助开发者深入理解程序在运行时的行为,特别是库函数的调用情况,对于诊断和解决问题具有重要的作用。

ltrace 命令是用来跟踪进程调用库函数的情况。在Linux中,该命令的语法为:ltrace (option …)。其中,常用的选项包括:

  • -a:对齐具体某个列的返回值。
  • -c:计算时间和调用,并在程序退出时打印摘要。
  • C:解码低级别名称(内核级)为用户级名称。
  • -d:打印调试信息。
  • -e:改变跟踪的事件。
  • -f:跟踪子进程。
  • -h:打印帮助信息。
  • -i:打印指令指针,当库调用时。
  • -l:只打印某个库中的调用。
  • -L:不打印库调用。
  • -n:实例最基本的跟踪选项。
  • -o:将跟踪输出写入指定的文件中。
  • -p:附加到指定进程ID的进程上。
  • -r:打印相对时间戳。
  • -s:指定要打印的字符串大小。
  • -S:跟踪系统调用和库调用。
  • -t:打印绝对时间戳。
  • -T:显示每个调用所花费的时间。
  • -u:以指定用户的身份运行命令。
  • -V:输出版本信息并退出。
  • -w:打印最多NR个栈帧的回溯信息。
    你可以使用 ltrace -h 命令来获取更多关于 ltrace 命令选项的信息。下面是一个简单的 ltrace 命令用法示例:
ltrace -c -f /bin/ls

在这个示例中,ltrace命令会跟踪/bin/ls命令的执行过程,计算每个函数调用的时间和调用次数,并在程序退出时打印摘要。


4. ptrace

ptrace() 是 Linux 系统中的一个库函数,它允许一个进程(通常被称为跟踪者或被调试器)控制和检查另一个进程(通常被称为被跟踪者或目标进程)的执行,同时能够读取和修改目标进程的内存和寄存器。这个函数通常用于实现调试器,例如 GDB,但也可以用于其他类型的程序分析或修改。

ptrace() 函数的基本工作原理是:

  • 附着:跟踪者进程使用 ptrace() 附着到目标进程上。此时,目标进程会停止执行,直到跟踪者进程发出继续执行的命令。
  • 控制:附着后,跟踪者进程可以使用 ptrace() 发送不同的请求给目标进程,例如单步执行、继续执行、读取/写入内存等。
  • 读取和修改:跟踪者进程可以读取目标进程的内存、寄存器和其他状态信息,也可以修改这些信息。
  • 分离:当跟踪者进程完成其任务后,它会从目标进程上分离,此时目标进程可以继续独立执行。
    ptrace() 函数的原型如下:
#include <sys/ptrace.h>  
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

其中:

  • request 是一个枚举值,指定了要执行的操作(例如 PTRACE_ATTACH、PTRACE_DETACH、PTRACE_PEEKDATA 等);
  • pid 是目标进程的进程 ID;
  • addr 是目标进程的某个内存空间首地址,可以通过该参数对目标进程的某内存地址进行读或写操作;
  • data 根据不同的指令,有不同的用途。

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开发板)
【15】使用linux kernel代码编译perf工具
【16】Linux 内核动态打印调试(dev_info、 dev_dbg )
【17】Linux内核调试工具 Ftrace 进阶使用手册
【18】手把手教你使用 ftrace
【19】威力巨大的系统调用——ptrace
【20】ptrace系统调用详解

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解中文编码:原理、应用与实践

title: 深入理解中文编码&#xff1a;原理、应用与实践 date: 2024/4/12 15:09:00 updated: 2024/4/12 15:09:00 tags: 中文编码字符集编码标准存储处理转换技术安全加密未来趋势 第一章&#xff1a;引言 编码的基本概念与作用 编码是将信息转换为特定格式以便存储、传输或处…

在启动Windows安装的Nacos时报错

Please set the JAVA_HOME variable in your environm 有可能时jdk版本过低引起的&#xff0c;所以安装一个1.8版本以上的jdk 在安装jdk完成以后配置好环境变量&#xff0c;测试一下 winr打开控制台&#xff0c;输入&#xff1a; Java -version 出现如下情况说明jdk安装配置…

护眼台灯哪个牌子最好,五款高中生护眼台灯推荐

​在当今时代&#xff0c;孩子们背负着沉重的学业负担&#xff0c;随着他们年龄的增长&#xff0c;作业量也随之增加&#xff0c;这意味着每天用眼的时间越来越长。尤其是在夜晚&#xff0c;许多孩子学习到深夜&#xff0c;若照明不当&#xff0c;极易导致视力下降。因此&#…

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

LLM大语言模型(九):LangChain封装自定义的LLM

背景 想基于ChatGLM3-6B用LangChain做LLM应用&#xff0c;需要先了解下LangChain中对LLM的封装。本文以一个hello world的封装来示例。 LangChain中对LLM的封装 继承关系&#xff1a;BaseLanguageModel——》BaseLLM——》LLM LLM类 简化和LLM的交互 _call抽象方法定义 ab…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一&#xff0c;dxp的pcb编辑器环境 1&#xff0c;创建新的PCB设计文档 2&#xff0c;PCB编辑器界面 1&#xff09;布线工具栏 2&#xff09;公用工具栏 3&#xff09;层标签栏 ​编辑 3&#xff0c;PCB设计面板 1&#xff09;打开pcb设计面板 4&#xff0c;PCB观…

【数据结构】单链表(二)

目录 1.查找数据 2.指定位置插入和删除节点 2.1 指定位置之前插入节点 2.2 指定位置之后插入节点 2.3 删除指定位置节点 2.4 删除指定位置之后的节点 3.销毁链表 我们接着上一篇【数据结构】单链表&#xff08;一&#xff09;-CSDN博客 来继续实现单链表 1.查找数据 在…

前端开发学习笔记 3 (Chrome浏览器调试工具、Emmet语法、CSS复合选择器、CSS元素选择模式、CSS背景)

文章目录 Chrome浏览器调试工具Emmet语法CSS复合选择器后代选择器子选择器并集选择器伪类选择器 CSS元素选择模式元素选择模式概述CSS块标签CSS行内标签CSS行内块标签CSS元素显示模式转换 CSS背景CSS背景颜色CSS背景图片CSS背景图片平铺CSS背景图片位置CSS背景图片固定CSS背景复…

SpringAI初体验之HelloWorld

目录 前言1.准备工作2.初始化项目3.解决问题3.1 Connection Time out 连接超时问题3.2 You exceeded your current quota 额度超限问题 4.访问调用5.总结 前言 在逛SpringBoot页面时突然看到页面上新增了一个SpringAI项目,于是试了一下&#xff0c;感觉还行。其实就是封装了各家…

Redis性能管理和集群的三种模式(二)

一、Redis集群模式 1.1 redis的定义 redis 集群 是一个提供高性能、高可用、数据分片、故障转移特性的分布式数据解决方案 1.2 redis的功能 数据分片&#xff1a;redis cluster 实现了数据自动分片&#xff0c;每个节点都会保存一份数据故障转移&#xff1a;若个某个节点发生故…

网络协议学习——以太网协议

目录 ​编辑 一&#xff0c;以太网简介 二&#xff0c;以太网通信的过程 为什么不用IP地址&#xff1f; 过程 MAC帧 MAC帧的字段介绍 ARP协议 传输过程的一些问题 RARP协议 提高效率 三&#xff0c;其他问题 ARP诈骗问题 URL解析过程 一&#xff0c;以太网简介 …

AI大模型基石:文字与数字的起源与演变

AI大模型基石&#xff1a;文字与数字的起源与演变 1、文字 1.1、起源 我们的祖先在还没有发明文字和语言之前就已经开始使用“咿咿呀呀”的声音来传播信息了&#xff0c;比如在野外活动遇到危险&#xff0c;然后发出“咿咿呀呀”的声音来提醒同伴小心&#xff0c;同伴在接收到…

GEE数据集——1986年—2022年加拿大全国烧毁面积综合数据 (NBAC)

简介 加拿大全国烧毁面积综合数据 (NBAC) 全国烧毁面积综合数据 (NBAC) 是一个地理信息系统数据库和系统&#xff0c;用于计算自 1986 年以来每年全国范围内烧毁的森林面积。这些数据用于帮助估算加拿大的碳排放量。烧毁面积是通过评估一系列可用数据源确定的&#xff0c;这些…

废品回收小程序推动回收行业的发展趋势

回收在全球都是一个重要行业&#xff0c;它为全球的环保作出了重要贡献。 随着科技的不断发展创新&#xff0c;废品回收的方式也逐渐多样&#xff0c;全新的线上回收小程序也逐渐出现在大众的生活中&#xff0c;在当下的手机时代&#xff0c;线上回收也为大众提供了更加便利的…

vs2022启动cmake项目(qt+c++)

1.本工程&#xff0c;如图&#xff0c;1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面&#xff0c;就说明配置没问题 5.启动 6.最后会自己生成其他文件

本地MinIO存储服务通过Java程序结合cpolar实现远程连接上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统&#xff0c;它可以100%的运行在标准硬件上&#xff0c;即X86等…

idea 卡怎么办

设置内存大小 清缓存重启 idea显示内存全用情况 右下角

适配器模式类图与代码

某软件系统中&#xff0c;已设计并实现了用于显示地址信息的类Address,现要求提供基于Dutch语言的地址信息显示接口。为了实现该要求并考虑到以后可能还会出现新的语言的接口&#xff0c;决定采用适配器(Adapter)模式实现该要求&#xff0c;得到如图7.9所示的类图。 【Java代码…

Docker操作容器打包(commit),压缩(save),挂载(load)

文章目录 前言一、容器打包二、将镜像压缩成tar包三、将tar包挂载为镜像结束 前言 将容器打包成镜像时&#xff0c;你正在将应用程序及其所有依赖项、文件和配置文件捆绑到一个可移植的、独立的单元中。这样做可以确保您的应用程序在不同环境中具有一致的运行方式&#xff0c;…

ASUS华硕ROG幻16Air笔记本电脑GU605M原装出厂Win11系统工厂包下载,带有ASUSRecovery一键重置还原

适用型号&#xff1a;GU605MI、GU605MY、GU605MZ、GU605MV、GU605MU 链接&#xff1a;https://pan.baidu.com/s/1YBmZZbTKpIu883jYCS9KfA?pwd9jd4 提取码&#xff1a;9jd4 华硕原厂Windows11系统带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性联机支持…