android8.0 kernel4.9.44 各层log打开

一.问题
平台android8.0 kernel4.9.44,想加个i2c驱动,打开log都是一件脑瓜疼的事。
二.log总结
android有三种log。
1.kernel下面的,就是driver层log。
2.kernel上面的,init和init.rc启动的程序的log,应用层
3.kernel上面的,android的log,就是logcat打印的。
三.log打开方式
1.kernel下面的,就是driver层log。
1.1打印log使用printk,printk有如下方式

printk("default,其实等于KERN_WARNING=4");//不加KERN_ERR KERN_DEBUG这些,其实等于KERN_WARNING
printk(KERN_EMERG "====> KERN_EMERG=0");
printk(KERN_ALERT "====> KERN_ALERT=1");
printk(KERN_CRIT  "====> KERN_CRIT=2");
printk(KERN_ERR   "====> KERN_ERR=3");
printk(KERN_WARNING "====> KERN_WARNING=4");
printk(KERN_NOTICE "====> KERN_NOTICE=5");
printk(KERN_INFO "====> KERN_INFO=6");
printk(KERN_DEBUG  "====> KERN_DEBUG=7");

1.2系统启动后,打印log可以用
1.2.1 dmesg 可以打印所有log
1.2.2 cat /proc/kmsg 可以打印所有log,再次敲命令cat /proc/kmsg只会打印接下来的log,就是说log打印完后会被清除掉
1.2.3 不想敲命令,想在串口看见log,要设置串口log级别。
查看KERN_ERR=3及以下的log,dmesg -n 4或者echo 4 > /proc/sys/kernel/printk
查看KERN_WARNING=4及以下的log,dmesg -n 5或者echo 5 > /proc/sys/kernel/printk
查看KERN_DEBUG=7及以下的log,dmesg -n 8或者echo 8 > /proc/sys/kernel/printk

2.kernel上面的,init和init.rc启动的程序的log,应用层
2.1 init程序启动后会重定向文件,串口是看不见log的。
要调试,如果程序可以在串口执行,试试串口执行,或者在init.rc里修改启动方式
service logwrapper /system/bin/logwrapper /system/bin/hello,用android工具logwrapper 执行服务
3.kernel上面的,android的log,就是logcat打印的。不再赘述。
四、调试kernel杂项
1.编译烧录kernel
make bootimage -j44,然后烧录boot.img,kernel在boot.img分区里面
2. 驱动里module_init函数 log不打印 ,read函数和write函数有log
dmesg缓冲区是有大小限制的,log太多,前面的log已经被清除了。开机后快速dmesg可以得到log的
3.编译报错
Unknown symbol __class_create (err 0)
Unknown symbol device_create (err 0)
解决,增加声明 MODULE_LICENSE(“GPL”);
4. i2c 地址0x18 要左移一位 0x18<<1 =0x30是读地址,0x31就是写地址
dts里面写0x18

20190320补充
android c/c++层ALOGV ALOGD等打开
在c/c++代码最上面加
#define LOG_TAG “AudioManagerService”
#define LOG_NDEBUG 0
一定要在最上面加,然后才include其他头文件

你可能感兴趣的:(android8.0 kernel4.9.44 各层log打开)