内核Call Trace调试
参考文章
- 该链接讲述了Call Trace 的调试方法
- 带symbol的内核镜像安装,正常情况下/usr/lib/debug/boot/会保存带symbol的内核镜像,如果找不到,可以按照以下方式自行
https://wiki.ubuntu.com/Debug Symbol Packages
调试步骤
创建调试目录
mkdir -p ~/workspace/call_trace
设计异常模块
- 创建kernel_call_trace.c文件
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/mm.h>
char *ptr = NULL;
int __init init_module(void) {
//ptr = kmalloc(sizeof(int), GFP_KERNEL);
*ptr = 0;
printk(KERN_ALERT "Call trace:\n");
//backtrace();
// BUG();
return 0;
}
void __exit cleanup_module(void) {
//kfree(ptr);
}
- 创建Makefile文件
obj-m := kernel_call_trace.o
all:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(PWD) modules
clean:
make -C /usr/src/linux-headers-$(shell uname -r) M=$(PWD) clean
- make,生成 kernel_call_trace.ko 模块
debug@debug-virtual-machine:~/workspace/call_trace$ make
make -C /usr/src/linux-headers-6.2.0-37-generic M=/home/debug/workspace/call_trace modules
make[1]: Entering directory '/usr/src/linux-headers-6.2.0-37-generic'
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-11 (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
You are using: gcc-11 (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
CC [M] /home/debug/workspace/call_trace/kernel_call_trace.o
MODPOST /home/debug/workspace/call_trace/Module.symvers
CC [M] /home/debug/workspace/call_trace/kernel_call_trace.mod.o
LD [M] /home/debug/workspace/call_trace/kernel_call_trace.ko
BTF [M] /ho