
调试技巧
文章平均质量分 93
嵌入式与Linux那些事
这个作者很懒,什么都没留下…
展开
-
【调试】pstore原理和使用方法总结
pstore最初是用于系统发生oops或panic时,自动保存内核log buffer中的日志。不过在当前内核版本中,其已经支持了更多的功能,如保存console日志、ftrace消息和用户空间日志。同时,它还支持将这些消息保存在不同的存储设备中,如内存、块设备或mtd设备。原创 2024-02-07 17:51:16 · 3339 阅读 · 1 评论 -
【调试】crash使用方法
crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能非常强大。可以查看堆栈,dmesg日志,内核数据结构,反汇编等等。crash支持多种工具生成的转存文件格式,如kdump,LKCD,netdump和diskdump,而且还可以分析虚拟机Xen和Kvm上生成的内核转存文件。同时crash还可以调试运行时系统,直接运行crash即可,ubuntu下内核映象存放在。该命令将内核崩溃时所有进程按最后运行时间戳进行排序,最后运行的进程排在最前面。转载 2023-04-30 10:35:24 · 8090 阅读 · 0 评论 -
【调试】kdump原理及其使用方法
Kdump是在系统崩溃、死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获(内核崩溃)的时候产生的crash dump。Kdump 使用两个内核:生产内核和捕获内核。生产内核是一个普通内核,它使用特殊的 kdump 特定标志启动。我们需要告诉生产内核保留一些物理内存,用于加载捕获内核。我们需要提前加载捕获内核,因为在崩溃发生的那一刻,由于内核损坏,无法从磁盘读取任何数据。生产内核是捕获内核服务的对像。原创 2023-04-07 22:48:51 · 4369 阅读 · 0 评论 -
【调试】kprobes(二)使用方法
上一节介绍了kprobe的基本概念,下面我们将使用几个具体的例子,看下kprobe在实际使用中有那些应用场景。ARM32,ARM64,X86寄存器及访问方式。原创 2023-04-07 22:44:35 · 3465 阅读 · 0 评论 -
【调试】kprobes(一)基本概念
开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等。比较简单的做法是在内核代码对应的函数中添加日志打印信息,但这种方式往往需要重新编译内核或模块,重新启动设备之类的,操作较为复杂甚至可能会破坏原有的代码执行过程。原创 2023-04-07 22:33:31 · 3363 阅读 · 0 评论 -
【调试】perf和火焰图
perf是linux上的性能分析工具,perf可以对event进行统计得到event的发生次数,或者对event进行采样,得到每次event发生时的相关数据(cpu、进程id、运行栈等),利用这些数据来对程序性能进行分析。perf可以统计或采样的event有很多,如果我们要分析cpu,那么我们可以使用cpu-cyclescpu-clock来衡量占用cpu的程序的分布情况,还可以通过等event来分析造成cpu占用高的底层原因,确定原因后方便优化。原创 2023-04-07 22:32:32 · 3266 阅读 · 0 评论 -
【调试】ftrace(三)trace-cmd和kernelshark
之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd。原创 2023-04-07 22:26:52 · 3893 阅读 · 0 评论 -
【调试】ftrace(二)新增跟踪点
我们仿照,添加一个timer_stat的跟踪点,获取start_pid和slack参数。首先,需要在头文件种添加名为timer_stat的跟踪点。/**宏如下structname:表示跟踪点的名字,如上面的timer_stat。proto:表示跟踪点调用的入参的原型,比如timer类型为。args:表示参数。struct:定义跟踪器内部使用的__entry数据结构。assign:把参数复制到__entry数据结构中。print:定义输出的格式。接着在添加。原创 2023-03-03 22:38:14 · 3280 阅读 · 1 评论 -
【调试】ftrace(一)基本使用方法
Ftrace是Linux Kernel的官方tracing系统,支持Function trace、静态tracepoint、动态Tracepoint的跟踪,还提供各种Tracer,用于统计最大irq延迟、最大函数调用栈大小、调度事件等。Ftrace还提供了强大的过滤、快照snapshot、实例(instance)等功能,可以灵活配置。内核配置Ftrace后,如果功能不打开,对性能几乎没有影响。原创 2023-03-03 22:36:20 · 3937 阅读 · 0 评论 -
【调试】netconsole的使用
netconsole模块可以让printk信息(输出到控制台的信息)通过网络(UDP)发送到远程主机。与串口控制台不同,netconsole不需要串口线和串口。另外,它可以轻易地将多台服务器的内核信息收集到一台服务器上。当设备上串口无法使用时,使用netconsole将日志信息保存到远程主机更方便、可行。netconsole模块不能用于获取crash dump,也不能进行一般的控制台输入输出。原创 2023-02-23 22:41:18 · 4022 阅读 · 0 评论 -
【调试】sysRq按键使用方法
SysRq键是一个魔术案件,只要在内核没有完全卡死的情况下,内核都会相应SysRq 键的输入,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。SysRq 在处理系统挂起时安全重启方面已经比较完善了。原创 2023-02-23 22:21:02 · 4249 阅读 · 0 评论 -
【调试】GDB使用总结
bt fullbt full Nbt full -N用define可以自定义命令,用document可以给自定义的命令加说明,利用help 命令名可以查看定义的命令。define 命令名命令…………enddocument 命令名说明endhelp 命令名以下示例定义了名为li的命令。本文只是对gdb命令脚本做了一个粗浅的介绍,旨在起到抛砖引玉的效果。原创 2023-02-19 22:20:10 · 4209 阅读 · 1 评论 -
使用动态输出打印内核的DEBUG信息
printk()是很多嵌入式开发者喜欢用的调试手段之一,但是,使用printk()每次都要重新编译内核,很不方便。使用动态输出在不需要重新编译内核的情况下,方便的打印出内核的debug信息。要开启动态输出,内核需要添加。开启宏之后,dev_dbg()print_hex_dump_bytes()`所有信息都可以被动态打印出来。原创 2023-01-15 22:39:59 · 3107 阅读 · 1 评论 -
内核转储的设置
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做 Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。原创 2023-01-15 22:16:40 · 3346 阅读 · 0 评论 -
valgrind基本功能介绍、基础使用方法说明
Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。转载 2022-11-13 17:45:48 · 6799 阅读 · 0 评论 -
如何解读Linux Kernel OOPS信息
在linux内核里面有很多脚本工具,位于linux/scripts/,里面有一个decodecode工具可以用来转换机器码,decodecode脚本可以在没有源代码或符号表的情况下,将oops异常的log作为输入就可以解析出错误位置的汇编代码。LR:子程序的返回地址:从子程序返回后,主程序继续执行的指令的地址称为子程序的返回地址.LR也叫链接寄存器,用于存放子程序的返回地址。PC:PC也叫计数寄存器,用于存放下一条要执行的指令的地址,因此在子程序返回后,要将LR中的地址存入PC,即mov PC LR。原创 2022-10-31 22:14:36 · 2340 阅读 · 0 评论 -
如何在编码阶段减少代码中的bug?
前言作为一名合格的程序员,不写bug是不可能的。如何花费最少的时间来修复bug呢?在编码阶段借助一些静态分析工具往往可以事半功倍,减少代码中的bug。静态分析工具能够在代码未运行的情况下分析源代码,发现代码中的bug。在C/C++程序中,静态分析工具可以发现程序错误,如空指针取消引用、内存泄漏、被零除、整数溢出、越界访问、初始化前使用等。编译器中的静态分析编译器的目标是生成可执行文件,所以,他们并不关注静态代码分析。但是,随着编译器的慢慢完善,在静态分析方面也做得越来越好。比如,当我们编译代码原创 2022-04-25 22:28:45 · 2132 阅读 · 0 评论 -
利用QEMU+GDB搭建Linux内核调试环境
前言对用户态进程,利用gdb调试代码是很方便的手段。而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试。其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qemu就是一种。qemu是一款完全软件模拟(Binary translation)的虚拟化软件,在虚拟化的实现中性能相对较差。但利用它在测试环境中gdb调试Linux内核代码,是熟悉Linux内核代码的一个好方法。本文实验环境:ubuntu 20.04busybox-1.32.1Linux kerne原创 2022-04-25 22:15:14 · 2274 阅读 · 0 评论 -
i2c调试工具分享
i2c-tools简介在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。i2c-tools工具是一个专门调试i2c的,开源,可获取挂载的设备及设备地址,还可以读写I2C设备寄存器。下面我们就对这个工具的安装和使用做个简单介绍。i2c-tools安装下载地址:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/。本文使用的是原创 2022-03-27 11:18:58 · 6298 阅读 · 0 评论 -
【调试技巧】strace神器的使用方法详解与实践
strace命令是一个集**诊断**、**调试**、**统计**于一体的工具,我们可以用它来监控用户空间**进程和内核的交互**。比如对应用程序的**系统调用**、**信号传递**与**进程状态变更**等进行跟踪与分析,以达到解决问题的目的。系统调用;Linux驱动调试strace;Linux应用调试strace;Linux内核调试技巧;调试方法;代码调试;linux Android 调试方法原创 2021-05-25 09:31:18 · 5819 阅读 · 12 评论