活动地址: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