活动地址:CSDN21天学习挑战赛

调试

1、printk 调试

2、动态打印

(一)要使用动态打印,必须在内核配置时打开CONFIG_DYNAMIC_DEBUG宏。
​示例: 这里rv1126 为例子,在配置文件中把打开

root@wallace:/home/share/rv1126_v2xx/kernel/arch/arm/configs# vi rv1126_defconfig
root@wallace:/home/share/rv1126_v2xx/kernel/arch/arm/configs#
#chm add debug
CONFIG_DYNAMIC_DEBUG=y

(二)
自己可以尝试把 +p 换成 -p

控制某个文件:
echo -n "file xxx.c +p" > /sys/kernel/debug/dynamic_debug/control 控制某个函数:
echo -n "func xxx +p" > sys/kernel/debug/dynamic_debug/controlp:打开动态打印语句
f:打印函数名
l:打印行号
m:打印模块名字
t:打印线程ID

在没有配置CONFIG_DYNAMIC_DEBUG的时候,是没有dynamic_debug这个目录的,添加了才有

[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]# pwd
/sys/kernel/debug/dynamic_debug
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]# ls
control
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]# echo -n "file gadget.c +p" > control
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]#
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]#
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]#
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]# cat ./control | busybox grep "gadget"
drivers/usb/dwc3/gadget.c:941 [dwc3]dwc3_gadget_ep_enable =p "dwc3: invalid parameters\012"
drivers/usb/gadget/function/f_fs.c:2254 [usb_f_fs]ffs_do_os_descs =_ "%s returns %d\012"
.....
......
drivers/usb/gadget/function/f_fs.c:2291 [usb_f_fs]__ffs_data_do_os_desc =_ "usb_ext_compat_desc::Reserved1 forced to 1\012"
drivers/usb/gadget/function/f_fs.c:313 [usb_f_fs]__ffs_ep0_stall =_ "bogus ep0 stall!\012"
drivers/usb/gadget/function/u_audio.c:107 [u_audio]u_audio_iso_complete =_ "%s: i
drivers/usb/gadget/function/f_uac1.c:472 [usb_f_uac1]audio_get_intf_req =_ "bRequest 0x%x, w_value 0x%04x, len %d, entity %d\012"
drivers/usb/gadget/function/f_uac1.c:507 [usb_f_uac1]audio_set_endpoint_req =_ "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\012"
drivers/usb/gadget/function/f_uac1.c:554 [usb_f_uac1]audio_get_endpoint_req =_ "bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\012"
drivers/usb/gadget/function/f_uac1.c:624 [usb_f_uac1]f_audio_setup =_ "audio req%02x.%02x v%04x i%04x l%d\012"
drivers/usb/gadget/function/f_uac2.c:1013 [usb_f_uac2]in_rq_cs_range =_ "%s(): clk %d: report rate %d. %d\012"
drivers/usb/gadget/function/f_uac2.c:1018 [usb_f_uac2]in_rq_cs_range =_ "%s(): send %d rates, size %d\012"
drivers/usb/gadget/function/f_uac2.c:1114 [usb_f_uac2]ac_rq_in =_ "bRequest in 0x%x, w_value 0x%04x, len %d, entity %d\012"
drivers/usb/gadget/function/f_uac2.c:960 [usb_f_uac2]in_rq_cs_cur =_ "%s(): %d\012"
drivers/usb/gadget/function/f_uac2.c:1059 [usb_f_uac2]in_rq_fu =_ "%s(): send size %d\012"
drivers/usb/gadget/function/f_uac2.c:1201 [usb_f_uac2]ac_rq_out =_ "bRequest out 0x%x, w_value 0x%04x, len %d, entity %d\012"
drivers/usb/gadget/function/f_uac2.c:1175 [usb_f_uac2]out_rq_cs_cur =_ "control_selector UAC2_CS_CONTROL_SAM_FREQ, clock: %d\012"
drivers/usb/gadget/function/f_dfu.c:100 [usb_f_dfu]dfu_set_alt =_ "%s: intf:%d alt:%d\012"
drivers/usb/gadget/function/f_dfu.c:196 [usb_f_dfu]dfu_setup =_ "req_type: 0x%x ctrl->bRequest: 0x%x f_dfu->dfu_state: 0x%x\012"
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]#
[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]# echo -n "*usb* +p " > control
[  965.671194] dynamic_debug:ddebug_parse_query: expecting pairs of msh: write error: Invalid argumeant
tch-spec <value>
[  965.671264[root@RV1126_RV11] dynamic_debug:ddebug_exec_qu09:/sys/kernel/debug/dynamic_debug]e# ry: query parse failed[root@RV1126_RV1109:/sys/kernel/debug/dynamic_debug]#

内核休眠:

[root@MiWiFi-R3600-srv:/]# awk '$6 != 0 {print $1""$6}' /sys/kernel/debug/wakeup
_sources
nameactive_since
rga176523
ffbb0000.rkvenc37
[root@MiWiFi-R3600-srv:/]#
[root@MiWiFi-R3600-srv:/]# cat /sys/kernel/debug/wakeup_sources
name        active_count    event_count wakeup_count    expire_count    active_since    total_time  max_time    last_change prevent_suspend_time
rga             1       1       0       0       193042      193042      193042      1369        0
rfkill_rk_irq_wl    0       0       0       0       0       0       0       0       0
rfkill_wlan_wake    0       0       0       0       0       0       0       0       0
ffb20000.iep    0       0       0       0       0       0       0       0       0
ffb90000.vepu   0       0       0       0       0       0       0       0       0
ffb90400.vdpu   0       0       0       0       0       0       0       0       0
ffbb0000.rkvenc 11999       11999       0       0       2       162136      39      194409      0
ffb80000.rkvdec 0       0       0       0       0       0       0       0       0
rockchip_otg    0       0       0       0       0       0       0       0       0
serial-debug    1       1       0       0       0       500     500     610     0

2.1 dynamic动态打印转为printk正常打印

C文件开头添加#undef dev_dbg
#define dev_dbg dev_info
#undef pr_debug
#define pr_debug pr_info

2.2 dump_stack

存在的位置:kernel/lib/dump_stack.c
配置:make menuconfig -> kernel hacking--> kernel debug

示例:

#include <linux/module.h>
#include <linux/init.h>#include <linux/kprobes.h>
#include <asm/traps.h> static int __init hello_init(void)
{printk(KERN_ALERT "dump_stack start\n");dump_stack();printk(KERN_ALERT "dump_stack end\n");return 0;
}
static void __exit hello_exit(void)
{printk(KERN_ALERT "hello exit execute over !!! \n");
}module_init(hello_init);
module_exit(hello_exit);

编译成模块——》scp进入设备,test.ko——》insmod test.ko ——》dmes

[ 3077.154442] dump_stack start
[ 3077.154486] CPU: 1 PID: 2932 Comm: insmod Tainted: P           O      4.19.111 #4
[ 3077.154523] Hardware name: Generic DT based system
[ 3077.154575] [<b010f408>] (unwind_backtrace) from [<b010b96c>] (show_stack+0x10/0x14)
[ 3077.154620] [<b010b96c>] (show_stack) from [<b0846a24>] (dump_stack+0x90/0xa4)
[ 3077.154675] [<b0846a24>] (dump_stack) from [<af1b1014>] (hello_init+0x14/0x1000 [test])
[ 3077.154741] [<af1b1014>] (hello_init [test]) from [<b010265c>] (do_one_initcall+0x54/0x194)
[ 3077.154782] [<b010265c>] (do_one_initcall) from [<b01a0670>] (do_init_module+0x60/0x1f0)
[ 3077.154818] [<b01a0670>] (do_init_module) from [<b019f588>] (load_module+0x1e90/0x22f8)
[ 3077.154857] [<b019f588>] (load_module) from [<b019fc20>] (sys_finit_module+0xc8/0xd8)
[ 3077.154891] [<b019fc20>] (sys_finit_module) from [<b0101000>] (ret_fast_syscall+0x0/0x4c)
[ 3077.154915] Exception stack(0xdb86dfa8 to 0xdb86dff0)
[ 3077.154947] dfa0:                   000c5150 ffffffff 00000003 000c5150 00000000 aec53e2c
[ 3077.154978] dfc0: 000c5150 ffffffff aec53e2c 0000017b 000c46a4 00000000 a6fb8000 00000000
[ 3077.155000] dfe0: aec53b88 aec53b78 000258a0 a6f280f2
[ 3077.155023] dump_stack end

常用Linux内核调试手段介绍 02——— 内核笔记相关推荐

  1. redis常用linux指令(无介绍快使用)

    redis常用linux指令(无介绍快使用) 问题背景 登录关闭redis 创建键值对 切换16个数据库 数据库键的数量 清空数据库 模糊查询 通配符单个字符? 通配括号内的某一个字符 判断key是否 ...

  2. 第3章 Linux内核调试手段之内核打印

    开始 前面说的话 在我写代码的生涯里,我看到过很多大神炫耀自己的调试手段,也看到很多大神写过非常厉害的代码,我认为,相比于写代码,调试更加重要,而那些能在写代码的时候就加入了自己的调试信息的,就更加厉 ...

  3. 第3章 Linux内核调试手段之三

    之前的内核调试,我觉得应该再加上下面的东西,只有好好把下面的几个问题研究透了,你可能才是一个真正的内核高手,或者说,你还不是一个高手,就是一个内核的普通工程师,这个是我和Z总聊天说的,我当时问他,你对 ...

  4. 第3章 Linux内核调试手段之二

    =================== gdb 和 addr2line 调试内核模块 内核模块插入内核链表的时候,会调用 init 里面的程序,我们上面给的那个例程的程序因为是经过多年风吹雨打的,但是 ...

  5. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

  6. Crash内核调试手段

    kdump简介 kdump是系统崩溃的时候,用来转储运行内存的一个工具. 系统一旦崩溃,内核就没法正常工作了,这个时候将由kdump提供一个用于捕获当前运行信息的内核, 该内核会将此时内存中的所有运行 ...

  7. linux内核printk调试手段,[Mini2440] 内核调试手段之 printk

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 一. 内核打印函数 printk 介绍 1.1 前言 内核提供了 printk 函数在内核运行时打印信息,类似于 C 语 ...

  8. BUG_ON()、panic()、dump_stack()几种内核调试手段

    Linux内核有一些方法可以用来方便标记bug,提供断言并输出信息.最常用的两个是BUG()和BUG_ON(). 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印.这些声明会导致 oo ...

  9. linux内核调试指南

    Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...

最新文章

  1. mysql 慢日志 作用_MySQL慢查询日志的作用和开启
  2. FastRepot 列高自适应,自动换行,
  3. 上传文件 微信小程序input_快速上手微信小程序UI框架
  4. 信息系统项目管理师-范围管理知识点
  5. >mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied ,被mysql连接问题折磨到问题解决,分享
  6. 代码传奇丨美女黑客张婉桥的“爱丽丝奇遇记”
  7. monkeyrunner API接口文档内容
  8. oracle 定位行锁,oracle 的for update行锁语法
  9. nginx配置与常见错误解决方法
  10. 异域linux内核漏洞,Linux内核再现漏洞!这次11年后才发现
  11. torch的使用笔记
  12. 理解javascript:void(0);和href=#
  13. 微信授权登陆跳转提示10003 redirect_uri域名与后台配置不一致
  14. 机器学习笔记 - AutoML框架FLAML初体验
  15. CSS 只选中第一个和最后一个元素
  16. 理性的光辉,“哥德尔不完备定理”到底说了些什么?
  17. 【Matlab】如何自定义无输入和无输出的函数?
  18. 硬盘安装原版雪豹10.6.3与win7不完美教程
  19. [转载] 陈皓——程序员技术练级攻略
  20. 帝国时代php,依然经典,《帝国时代》WEB版现世

热门文章

  1. 移动应用安全架构设计
  2. 智能驾驶板块_无人驾驶板块全线走强 无人驾驶板块股票一览表
  3. 自己动手写CPU之第七阶段(10)——除法指令实现过程1
  4. [运维|virsh]virsh 命令行管理虚拟机
  5. 矩阵旋转(图像旋转)
  6. 如何使用U盘储存4G以上的大文件,比如说镜像文件
  7. asr标注工具_【AI模型测试】语音识别ASR的结果校对
  8. Kahn拓扑排序模板
  9. html里th是什么单位,网页中的th/th是什么意思
  10. Matplotlib,savefig保存图片不显示横纵坐标轴问题