常用Linux内核调试手段介绍 02——— 内核笔记
活动地址: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——— 内核笔记相关推荐
- redis常用linux指令(无介绍快使用)
redis常用linux指令(无介绍快使用) 问题背景 登录关闭redis 创建键值对 切换16个数据库 数据库键的数量 清空数据库 模糊查询 通配符单个字符? 通配括号内的某一个字符 判断key是否 ...
- 第3章 Linux内核调试手段之内核打印
开始 前面说的话 在我写代码的生涯里,我看到过很多大神炫耀自己的调试手段,也看到很多大神写过非常厉害的代码,我认为,相比于写代码,调试更加重要,而那些能在写代码的时候就加入了自己的调试信息的,就更加厉 ...
- 第3章 Linux内核调试手段之三
之前的内核调试,我觉得应该再加上下面的东西,只有好好把下面的几个问题研究透了,你可能才是一个真正的内核高手,或者说,你还不是一个高手,就是一个内核的普通工程师,这个是我和Z总聊天说的,我当时问他,你对 ...
- 第3章 Linux内核调试手段之二
=================== gdb 和 addr2line 调试内核模块 内核模块插入内核链表的时候,会调用 init 里面的程序,我们上面给的那个例程的程序因为是经过多年风吹雨打的,但是 ...
- 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装
这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...
- Crash内核调试手段
kdump简介 kdump是系统崩溃的时候,用来转储运行内存的一个工具. 系统一旦崩溃,内核就没法正常工作了,这个时候将由kdump提供一个用于捕获当前运行信息的内核, 该内核会将此时内存中的所有运行 ...
- linux内核printk调试手段,[Mini2440] 内核调试手段之 printk
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 一. 内核打印函数 printk 介绍 1.1 前言 内核提供了 printk 函数在内核运行时打印信息,类似于 C 语 ...
- BUG_ON()、panic()、dump_stack()几种内核调试手段
Linux内核有一些方法可以用来方便标记bug,提供断言并输出信息.最常用的两个是BUG()和BUG_ON(). 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印.这些声明会导致 oo ...
- linux内核调试指南
Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...
最新文章
- mysql 慢日志 作用_MySQL慢查询日志的作用和开启
- FastRepot 列高自适应,自动换行,
- 上传文件 微信小程序input_快速上手微信小程序UI框架
- 信息系统项目管理师-范围管理知识点
- >mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied ,被mysql连接问题折磨到问题解决,分享
- 代码传奇丨美女黑客张婉桥的“爱丽丝奇遇记”
- monkeyrunner API接口文档内容
- oracle 定位行锁,oracle 的for update行锁语法
- nginx配置与常见错误解决方法
- 异域linux内核漏洞,Linux内核再现漏洞!这次11年后才发现
- torch的使用笔记
- 理解javascript:void(0);和href=#
- 微信授权登陆跳转提示10003 redirect_uri域名与后台配置不一致
- 机器学习笔记 - AutoML框架FLAML初体验
- CSS 只选中第一个和最后一个元素
- 理性的光辉,“哥德尔不完备定理”到底说了些什么?
- 【Matlab】如何自定义无输入和无输出的函数?
- 硬盘安装原版雪豹10.6.3与win7不完美教程
- [转载] 陈皓——程序员技术练级攻略
- 帝国时代php,依然经典,《帝国时代》WEB版现世