debug学习

参考

内核

工具

kdump&crash

drgn

decode_stacktrace.sh

faddr2line

pengdl@ubuntu:~/x86/linux-5.19$ ./scripts/faddr2line ./vmlinux proc_reg_open+255 blk_mq_dispatch_rq_list+599
proc_reg_open+255/0x1f0:
proc_reg_open at fs/proc/inode.c:524

blk_mq_dispatch_rq_list+599/0x850:
blk_mq_dispatch_rq_list at block/blk-mq.c:1897


pengdl@ubuntu:~/x86/linux-5.19$ ./scripts/faddr2line ./fs/proc/inode.o  proc_reg_open+255
proc_reg_open+255/0x1f0:
proc_reg_open at /home/pengdl/work/Qemu/x86/linux-5.19/fs/proc/inode.c:524

stack canary

反汇编

硬件断点

GDB

debugfs

  • 命令
modprobe ice dyndbg=+p
echo "module ice +p" > /sys/kernel/debug/dynamic_debug/control
sudo insmod ice.ko dyndbg="+p" fwlog_events=0x0FFFFFFF fwlog_level=2

dmesg

  • 命令
# 等待输出新的内容日志: -w
dmesg -w file.log  # 将内核日志重定向到文件中,并且等待输出新的日志
  • 修改loglevel
dmesg -n 1  # 将console的loglevel设置为1
  • 向内核日志缓冲区写入日志
# echo hello > /dev/kmsg

trace

  • 向trace缓冲区写日志
# echo helo > trace_marker

dynamic debug

  • 开机启动时打开日志:Debug messages during Boot Process
    如果要控制多个,那么可以写多个"dyndbg=",或者在一个"dyndbg="里用分号分隔开:
    dyndbg="file params.c +p;file cpufreq.c +p"
    

打印coredump发生时的上下文

echo 1 > /proc/sys/kernel/print-fatal-signals

当发生段错误时,会从内核日志里看到:

01-01 08:07:45.954 22394 22394 I         : potentially unexpected fatal signal 11.
01-01 08:07:45.954 22394 22394 I         : CPU: 4 PID: 22394 Comm: Thread-19 Tainted: G S      WC OE      6.1.25-android14-11-maybe-dirty-qki-consolidate #1
01-01 08:07:45.954 22394 22394 I Hardware name: Qualcomm Technologies, Inc. Houji based on SM8650 (DT)
01-01 08:07:45.954 22394 22394 I pstate  : 20001000 (nzCv daif -PAN -UAO -TCO -DIT +SSBS BTYPE=--)
01-01 08:07:45.954 22394 22394 I pc      : 000000009c3db42c
01-01 08:07:45.954 22394 22394 I lr      : 0000006fc90109a8
01-01 08:07:45.954 22394 22394 I sp      : 0000006faf7391a0
01-01 08:07:45.954 22394 22394 I         : x29: 0000006faf7391f0 x28: 000000000000206e x27: 0000006faf739300
01-01 08:07:45.954 22394 22394 I         : x26: 000000006fc8f9e8 x25: 0000000000000002 x24: 0000006fd2244800
01-01 08:07:45.954 22394 22394 I         : x23: 0000006faf7392b0 x22: 0000006fd22448b0 x21: 0000000000000000
01-01 08:07:45.954 22394 22394 I         : x20: 0000000000000000 x19: 0000006fd2244800 x18: 0000006faf739af0
01-01 08:07:45.954 22394 22394 I         : x17: 000000000000f3e4 x16: 0000006fb1188b70 x15: 0000000000000002
01-01 08:07:45.954 22394 22394 I         : x14: 0000006fc9010908 x13: 0000006fc9010888 x12: 0000006fc9010838
01-01 08:07:45.954 22394 22394 I         : x11: 0000006fc90107d8 x10: 0000006fc8c05314 x9 : 000000009c3db400
01-01 08:07:45.954 22394 22394 I         : x8 : 0000006faf7392f0 x7 : 3a656d614e646165 x6 : 0000006faf739658
01-01 08:07:45.954 22394 22394 I         : x5 : 0000006fc8c05311 x4 : 0000006faf739658 x3 : 0000006fd2244800
01-01 08:07:45.954 22394 22394 I         : x2 : 00000000138b24f0 x1 : 00000000138b24b8 x0 : 000000006fc8f9e8

查看系统调用的参数

$ cat /proc/self/syscall
0 0x3 0x75ee8c1e8000 0x20000 0x22 0x75ee8c1e7010 0x75ee8c1e7010 0x7fff6fe00c88 0x75ee8bf147e2

需要注意的是,如果要查看的进程此时正在执行,那么会返回错误。参数含义参考proc_pid_syscall,第一个表示系统调用号,接下来的6个表示系统调用的参数,最后2个分别表示用户的SP和PC寄存器的值

内存类

kasan

OOB

UAF

kfence

OOB

UAF

KCSAN

KMSAN

UBSAN

内存泄漏

slub_debug

死锁

softlockup

hung task

hard lockup

应用

ASAN

Heaptrack

服务器故障排查

posted @ 2022-06-12 09:24  dolinux  阅读(767)  评论(0)    收藏  举报