安卓实体机系统上kernel调试log,trace开发的技巧汇总

kernel中加入相关日志打印调试:

// 1. 直接用 printk

#include <linux/printk.h>                                                                                                                                                                                     
  printk(KERN_ERR "something wrong\n");         

// 2. pr_xxx 宏 (不需要 dev,自动加模块名)

  pr_info("power key pressed\n");      // 输出: <6>qpnp-power-on: power key pressed                                                                                                                                
  pr_err("something failed\n");                                                                                                                                                                                    
  pr_debug("debug info\n");                

// 3. dev_xxx (需要 dev)

  dev_info(dev, "power key pressed\n");                                                                                                                                                                            
  dev_err(dev, "something failed\n");                                                                                                                                                                              
  dev_dbg(dev, "debug info\n");      

kernel中加入相关的堆栈打印:

#include <linux/printk.h> //引入头文件
     dump_stack();

可以看看下面是power键案例

     0     0 I Call trace:  
     0     0 I         : [<000000004d1d622f>] dump_backtrace+0x0/0x41c
     0     0 I         : [<00000000422c8119>] show_stack+0x14/0x1c
     0     0 I         : [<00000000d01c0dc6>] dump_stack+0xc4/0xfc
     0     0 I         : [<00000000554b8d0a>] qpnp_kpdpwr_irq+0x34/0x1b8
     0     0 I         : [<0000000053294c6d>] __handle_irq_event_percpu+0x10c/0x2a4
     0     0 I         : [<000000000f0fb616>] handle_irq_event+0x54/0xc0
     0     0 I         : [<000000003d3e783c>] handle_edge_irq+0xc8/0x188
     0     0 I         : [<00000000c64e8964>] generic_handle_irq+0x24/0x3c
     0     0 I         : [<00000000463cc320>] periph_interrupt+0x74/0x114
     0     0 I         : [<000000003078d434>] pmic_arb_chained_irq+0x13c/0x228
     0     0 I         : [<00000000b02011aa>] __handle_domain_irq+0x7c/0xbc
     0     0 I         : [<000000001323b657>] gic_handle_irq+0xf8/0x198
     0     0 I         : Exception stack(0xffffff8e6f203d00 to 0xffffff8e6f203e30)
     0     0 I 3d00    : fffffff70b947632 00000000000001c0 0000000000000001 0000000000000001
     0     0 I 3d20    : 00000008f46b85f0 0000000000000001 00000000000006a0 0000000001312d00
     0     0 I 3d40    : 0000000000000000 0000000000000001 0018701a7711de00 0000000034155555
     0     0 I 3d60    : 0000000000000018 0000000000001b0a 0000000000000000 000000000000009c
     0     0 I 3d80    : 0000000000049959 00000000000003d1 0000000000000004 0000000000000000
     0     0 I 3da0    : ffffffc26c1b6018 ffffff8e6ec9ba90 000000340e8ca000 ffffff8e6f330000
     0     0 I 3dc0    : 0000000000000000 000000000000003b ffffff8e6ec9ba48 ffffffc27d565a50
     0     0 I 3de0    : ffffff8e6f221900 ffffff8e6f203e40 ffffff8e6d957ec4 ffffff8e6f203e30
     0     0 I 3e00    : ffffff8e6d957f00 00000000a0c00145 000000340e8ca000 ffffff8e6ec9ba90
     0     0 I 3e20    : ffffffffffffffff 0000000000000000
    0     0 I         : [<00000000a7ce830f>] el1_irq+0xe8/0x18c
    0     0 I         : [<000000001cdfc47a>] lpm_cpuidle_enter+0x46c/0x4b0
    0     0 I         : [<0000000029da8379>] cpuidle_enter_state+0x1ac/0x31c
    0     0 I         : [<0000000093efd304>] cpuidle_enter+0x18/0x20
    0     0 I         : [<00000000a609a1d9>] cpu_startup_entry+0x164/0x1f4
    0     0 I         : [<0000000021dd2f61>] rest_init+0x7c/0x88
    0     0 I         : [<000000005a292c16>] start_kernel+0x440/0x4c0
    0     0 I         : [<00000000e3d213b3>] __primary_switched+0x64/0x90

kernel中添加相关的perfetto的trace

+++ b/drivers/input/evdev.c
@@ -26,6 +26,7 @@
 #include <linux/major.h>
 #include <linux/device.h>
 #include <linux/cdev.h>
+#include <trace/events/input.h>
 #include "input-compat.h"
 
 enum evdev_clock_type {
@@ -306,6 +307,8 @@ static void evdev_events(struct input_handle *handle,
        struct evdev_client *client;
        ktime_t ev_time[EV_CLK_MAX];
 
+       INPUT_ATRACE_BEGIN("evdev_deliver");
+
        ev_time[EV_CLK_MONO] = ktime_get();
        ev_time[EV_CLK_REAL] = ktime_mono_to_real(ev_time[EV_CLK_MONO]);
        ev_time[EV_CLK_BOOT] = ktime_mono_to_any(ev_time[EV_CLK_MONO],
@@ -322,6 +325,8 @@ static void evdev_events(struct input_handle *handle,
                        evdev_pass_values(client, vals, count, ev_time);
 
        rcu_read_unlock();
+
+       INPUT_ATRACE_END("evdev_deliver");
 }
 

主要就是
1、#include相关的头文件 <trace/events/input.h>

2、INPUT_ATRACE_BEGIN(“evdev_deliver”);

实际上最后也是调用trace_tracing_mark_write
/home/test/disk_2T/aosp15_xiaomi/kernel/xiaomi/sdm710/include/trace/events/input.h

/*
 * Convenience wrappers — use these in driver code.
 *
 * Usage in ISR:
 *   INPUT_ATRACE_BEGIN("input_irq");
 *   ... handle interrupt, call input_report_* / input_sync ...
 *   INPUT_ATRACE_END("input_irq");
 */
#define INPUT_ATRACE_BEGIN(name) \
	trace_tracing_mark_write(current->tgid, name, 1)
#define INPUT_ATRACE_END(name) \
	trace_tracing_mark_write(current->tgid, name, 0)

添加相关的log

编译命令kernel相关img的:

make bootimage

重启进入fastboot模式

adb reboot bootloader

在这里插入图片描述

刷入对应的boot.img

fastboot flash boot out/target/product/grus/boot.img
Sending 'boot' (131072 KB)                         OKAY [  2.997s]
Writing 'boot'                                     OKAY [  0.640s]
Finished. Total time: 3.734s

然后再进行重启:

 fastboot reboot
Rebooting                                          OKAY [  0.000s]
Finished. Total time: 0.401s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值