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

 

 

 

 

 

 

 

posted @ 2025-06-13 17:49  雲淡風輕333  阅读(29)  评论(0)    收藏  举报