debug学习
参考
- https://blog.csdn.net/rikeyone/category_10354155.html
- Linux内核故障分类和排查
- Linux内核中oops 错误解析以及问题定位
- panic和oops的区别
- 内核问题分析文章
- Linux中的错误码
- Remote Serial Console HOWTO 配置串口
- Internet FAQ Archives
- 服务器案例查询助手
- Welcome to learning debugging
- 谈复杂软件低概率问题定位和复现
- 测试工具
内核
工具
kdump&crash
- openEuler kernel 技术分享 - 第1期 - kdump 基本原理、使用及案例介绍
- openEuler kernel 技术分享 - 第3期 - Crash工具基本使用及实战分享
- crash、kdump工具学习
- crash工具和x86-64汇编基础
- 使用crash工具分析高通ramdump
- early kdump
- Documentation for Kdump - The kexec-based Crash Dumping Solution
- Linux Kdump 机制详解
- crash实战:手把手教你使用crash分析内核dump
drgn
- github: https://github.com/osandov/drgn
- 使用手册
- User Guide
- A kernel debugger in Python: drgn
- Powerful and Programmable Kernel Debugging with drgn
- BPF drgn tools
- drgn: How the Linux Kernel Team at Meta Debugs the Kernel at Scale
- drgn - Linux 调试的另一只翅膀 [上]
- drgn - Linux 调试的另一只翅膀 [下]
- Enter the drgn
- 使用drgn分析kdump:
sudo drgn -s /mnt/linux-6.10/vmlinux -c /var/crash/202408232354/dump.202408232354
- 使用drgn分析live kernel:
-示例:sudo drgn -s /mnt/linux-6.10/vmlinux
- 内核中的一些基于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
反汇编
硬件断点
- bpftrace
- 硬件断点API
GDB
- gdb Debugging Full Example (Tutorial)
- Bug hunting
- 使用gdb查看结构体成员偏移
- Debugging with GDB
- Debugging kernel and modules via gdb
- gdb 一行命令
gdb -ex 'info functions' -ex 'info files' -e 'quit' ./hello.ko
- The GDB developer's GNU Debugger tutorial
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"
内存类
kasan
- 内核地址消毒剂(KASAN)
- KASAN实现原理
- 内存错误检测 (KASAN) 详解
- Linux内核中使用内存检测
- 案例分析(二)内存越界检测工具kasan
- DEBUG memory问题的一些工具以及注意事项
- ASan
- Memory Tagging for the kernel — Tag-Based KASAN
- 台湾Linux骇客分享:使用KASAN DEBUG内存问题
- Hardware Tag-Based KASAN
OOB
UAF
kfence
OOB
UAF
KCSAN
KMSAN
UBSAN
内存泄漏
slub_debug
死锁
softlockup
hung task
hard lockup
应用
ASAN
Heaptrack
服务器故障排查
本文来自博客园,作者:摩斯电码,未经同意,禁止转载