DEBUG之动态log调试
简介:
动态log调试指的是在kernel代码中pr_debug()等log调试函数的打开与关闭。在我现在的理解中,打开动态log调试就是让pr_debug()这个定义在内核中的log打印函数“起作用”。打开动态log调试之后,用dmesg命令查看内核log时,会看到相关模块内pr_debug()中要打印的内容出现在内核log中。而关闭动态log调试后,在内核log中不会看到pr_debug()中要打印的内容。在这里pr_debug()只是动态log调试控制的其中一个函数,但不只这一个函数,由于其它函数我没有接触过,就不列举
了。
本文只介绍动态log打开关闭的基本方法,对其原理不胜了解,就不阐述了。
方法:
以高通的SDM660芯片为例:
打开动态log调试:
1.首先在android源码目录找到/kernel/msm-4.4/arch/arm64/configs/sdm660_defconfig文件,查看其中的CONFIG_DYNAMIC_DEBUG=y这句宏定义是否存在,存在表明动态调试配置好了,不存在就加上再重新编译一下代码。默认情况下是 已经配置好的。
2.然后adb shell连接设备控制台。
3.执行echo ‘8 6 1 7’ > /proc/sys/kernel/printk,把printk语句都打开。
4.执行echo -n “file 文件名 +p” > /sys/kernel/debug/dynamic_debug/control,打开对应文件名里的pr_debug()语句,这一步就是打开动态log调试。
5.再执行dmesg查看kernel内的输出log是否有你想要的log。
关闭动态log调试:
1.执行echo -n “file 文件名 -p” > /sys/kernel/debug/dynamic_debug/control,就关闭了动态log调试。
结语:
动态log调试在我的工作中暂时还没什么机会用到,我也就用过一次。关于内核为什么要设计动态log调试这个模块,我有一点猜想。log打印毕竟是要消耗CPU的资源,增加进程的总运行时间的。log打印语句太多会造成CPU资源的浪费和进程运行卡顿,但有些时候又必需要添加很多log来调试程序怎么办?动态log调试就解决了这个问题,在需要的时候才打开很多log输出语句,不需要的时候就关闭它。