常用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/control

p:打开动态打印语句
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值