vmlinux调试与内核丢包
1、获取对应内核版本的vmlinux:
注意:用于调试的设备,内核版本需要高于被调试的环境内核
2c2g不满足部署vmlinux条件,始终会被oom....
下载linux内核
这得先到https://cdn.kernel.org/pub/linux/kernel/v4.x/找到准备调试的内核版本的包,现网环境是4.19.48,我这里就下载对应版本的包到家里环境:
yum -y install aria2
aria2c -x 16 -s 16 https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.48.tar.xz
下好包解压:
tar -xvf linux-4.19.48.tar.xz
make menuconfig前安装点必要的东西:
yum install ncurses-devel -y
yum install elfutils-libelf-devel -y
yum groupinstall "Development Tools" -y
yum install openssl-devel -y
sudo yum groupinstall "Development Tools"
sudo yum install ncurses-devel flex bison openssl-devel elfutils-libelf-devel
然后make menuconfig:
cd linux-4.19.48
make menuconfig
出来界面后直接save、load、exit就生成.confg文件了:(此处少截了好几张图)
生成.config后再vi编辑,确保如下参数存在并正确:
CONFIG_DEBUG_KERNEL=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
CONFIG_SYSTEM_TRUSTED_KEYS=n
CONFIG_SYSTEM_EXTRA_CERTIFICATE=n
CONFIG_MODULE_SIG_KEY=n
最后再编译:
make -j 4 //这里主要看调试的机器有多少核
ake modules_install
make install
编译完后就能找到vmlinux了:
2、调试vmlinux找到虚拟内存地址
gdb调试vmlinux:
gdb /root/linux-4.19.48/vmlinux
出现如下界面证明成功了:
然后再反编译ip_rcv,找到该函数的虚拟内存地址:
执行命令:disassemble ip_rcv
找到ip_rcv的虚拟内存地址是0xffffffff81806250,+120偏移量则是0xffffffff818062c8
3、用虚拟内存地址找到源码中的行数和内容
用addr2line找到源码行数,这里也需要用到vmlinux:
addr2line -e vmlinux 0xffffffff818062c8
看到丢包是在244行,登录源码网站,找到第244行就行了:https://elixir.bootlin.com/linux/v4.19.48/source/include/linux/netfilter.h
可以轻松判断出是netfilter造成的丢包:
备注:第2、3步可以尝试直接使用 faddr2line:https://github.com/torvalds/linux/blob/master/scripts/faddr2line