在AWS环境中开展Linux内核调试是否可行?
在AWS环境中实现Linux内核调试(替代M3 Mac的x86虚拟机方案)
核心思路
在AWS上用两台x86_64架构的EC2实例模拟原有的"调试机-目标机"模式:一台作为调试主机安装GDB,另一台作为被调试的目标机,通过GDB远程调试协议建立连接,完成内核调试操作。
步骤1:实例准备
- 选择x86_64架构的EC2实例(如
t2.medium、c5.large),创建两台实例并部署同版本的Linux发行版(如Ubuntu 22.04、CentOS 9)。 - 确保两台实例处于同一VPC子网,并配置安全组:允许调试机的私有IP访问目标机的5000端口(GDB远程调试默认端口);或后续用SSM端口转发替代端口开放。
步骤2:配置被调试的目标实例
修改内核启动参数:
编辑GRUB配置文件/etc/default/grub,修改GRUB_CMDLINE_LINUX字段,添加禁用地址随机化和调试标记:GRUB_CMDLINE_LINUX="nokaslr debug"执行
update-grub(Debian/Ubuntu)或grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)更新启动配置,重启实例。安装并启动GDB服务器:
安装调试工具包:# Debian/Ubuntu sudo apt install gdbserver linux-image-$(uname -r)-dbg # RHEL/CentOS sudo dnf install gdbserver kernel-debuginfo-$(uname -r)启动GDB服务器,绑定到5000端口并加载内核镜像:
sudo gdbserver :5000 /usr/lib/debug/vmlinux-$(uname -r)
步骤3:配置调试主机实例
安装GDB并获取调试符号:
安装GDB:sudo apt install gdb # Debian/Ubuntu sudo dnf install gdb # RHEL/CentOS从目标机拷贝对应版本的内核调试符号文件(
/usr/lib/debug/vmlinux-$(uname -r))到调试主机,或直接在调试主机安装同版本的内核调试包。建立调试连接:
启动GDB并加载内核符号:gdb /path/to/vmlinux-<target-kernel-version>在GDB中连接目标机的GDB服务器:
target remote <目标机私有IP>:5000连接成功后,即可执行常规内核调试操作:设置断点(
break start_kernel)、查看内存(x/10x <address>)、单步执行(stepi)等。
更安全的替代方案:SSM端口转发
如果不想开放目标机的5000端口,可使用AWS Systems Manager(SSM)的端口转发功能:
- 确保目标实例已安装SSM Agent,并拥有
AmazonSSMManagedInstanceCore权限。 - 在调试主机上安装AWS CLI并配置权限,执行端口转发命令:
aws ssm start-session --target <目标实例ID> --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["5000"], "localPortNumber":["5000"]}' - 在调试主机的GDB中连接
localhost:5000即可建立调试会话。
关键注意事项
- 两台实例的内核版本(包括调试符号)必须完全一致,否则会出现符号不匹配导致调试失败。
- 必须禁用KASLR(
nokaslr参数),否则内核地址随机化会导致断点无法命中。 - 若编译自定义内核,需在编译时开启调试相关配置:
CONFIG_DEBUG_INFO=y、CONFIG_GDB_SCRIPTS=y、CONFIG_FRAME_POINTER=y。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

