Contents

Android9 ftrace 填坑指南

Contents

前置:

  • pixel3
  • 内核分支android-msm-crosshatch-4.9-pie-qpr1

编译方法:

  • 下载代码不说了,aosp常规操作,如何编译内核,参考官方文档Building Kernels

  • 首先执行build/config.sh配置,选择Kernel Hacking -> Tracers,勾选Function和Dynamic Trace等各项。config.sh完成后你会发现配置保存到了private/msm-google/arch/arm64/configs/b1c1_defconfig。

  • 参考官方使用Ftrace的文档,还是手动配置b1c1_defconfig来得实在。

  • /posts/2021/android9-ftrace-research/res/1.png

  • 配置CONFIG_FTRACE=y和CONFIG_DYNAMIC_FTRACE=y,然后执行SKIP_MRPROPER=1 build/build.sh,开始编译

  • 产物在out/android-msm-bluecross-4.9/dist/Image.lz4-dtb

  • 使用fastboot boot Image.lz4-dtb 先加载内核测试,先不用刷进去

Ftrace使用:

  • 参考文档Using ftrace,功能点很多

  • cd /sys/kernel/debug/tracing //进入tracefs目录

  • echo function > current_tracer //设置函数跟踪

  • echo SyS_kill > set_ftrace_filter //过滤kill调用,可用来跟踪壳的反调试

  • echo 1 > tracing_on //开启跟踪

  • cat trace //查看日志

  • echo 0 > tracing_on //关闭跟踪

  • /posts/2021/android9-ftrace-research/res/2.png

问题:

  • ftrace的几个编译错误

/posts/2021/android9-ftrace-research/res/3.png

  • 执行优化:LTO vmlinux.o时若提示错误,多半是内存不够,使用mkswap命令开大点
  • 内核编译ftrace后,查看available_tracers没有生效
    • 因为CONFIG_TRACE和CONFIG_DYNAMIC_FTRACE=y根本没写进去
  • 当执行build.sh会在check_config里面提示配置不一致
    • 修改build/_setup_env.sh里check_config为return 0,然后手动修改out/android-msm-bluecross-4.9/private/msm-google/defconfig添加两项配置CONFIG_FTRACE=y,CONFIG_DYNAMIC_FTRACE=y。
    • PS:这个Kconfig也是奇怪,通过menuconfig死活新增不了这两个配置

相关资料

其他记录

  • 构建bootimg (SKIP_MRPROPER=1 BUILD_BOOT_IMG=1 KERNEL_CMDLINE=“console=ttyUSB0,115200” ./build/build.sh)