動機

整理一些linux debug工具

之前提過

systemtap與bpf就像是手術刀,可以看到很詳細的部分 但在在那之前我們還是要看原本的程式或是kernel的log

ramoops

要先提pstore(persistent storage),讓kernel panic或是oops的log可以被存起來,讓userspace可以透過firesystem去讀log

ramoops就是配合pstore把log存在ram中

使用方式

  1. 開flag
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_FTRACE=y
CONFIG_PSTORE_RAM=y
  1. cat /sys/fs/pstore/console-ramoops

debugfs

procfs: 讓userspace可以與process交換資訊的filesystem sysfs: 讓userspace可以與device交換資訊的filesystem debugfs: 讓userspace可以與kernelspace的物件交換資訊的filesystem

都是與kernelspace的物件交換資訊的filesystem,重點是範疇不同

用法 mount -t debugfs none /sys/kernel/debug

dynamic_debug

kernel有printk,但是開了就很難關,所以有dynamic_debug,可以指定要開哪一行,甚至是哪一個thread的哪一行

match-spec* flags-spec

match-spec ::= 'func' string | # svc_tcp_accept, *recv*
               'file' string |  # drivers/usb/*, inode.c:start_*, inode.c:1-100
               'module' string | # drm*, nfsd
               'format' string | # 一般的string search
               'line' line-range

line-range ::= lineno |
               '-'lineno |
               lineno'-' |
               lineno'-'lineno

lineno ::= unsigned-int

用法

  1. 先開debugfs
  2. echo 'file $file_name -p' > /sys/kernel/debug/dynaminc_debug/control

to be continued

systemtap與bpf,需要知道一定的語法與對probe的了解才能用 也需要對kernel的版本有要求,或是裝專門的軟體,換言之就是不太方便用

之後會看strace與lstrace怎麼用

Ref

Android7.1 RK3399 使用 ramoops 机制查看开机 Kernel Log Dynamic debug Day29 procfs, sysfs, debugfs