Linux 内核问题调试手段

源代码定位方法 我们经常需要根据内核错误日志,在源代码中比较精确地定位到发生错误的那一行。一般而言,我们通过错误发生的地址来定位对应的源代码:(链接 ) 1# 注意:这里的 vmlinux 需要带有调试信息 2addr2line -f -e vmlinux <asm_addr> 然而在内核错误日志中,调用栈常以形如 bdi_register+0xec/0x150 的形式1展示函数调用地址,而 addr2line 无法解读这样的格式。此时我们可以使用 GDB 来解析该地址: 1# In `gdb vmlinux`, compiled with CONFIG_DEBUG_INFO=y 2 3list …

Linux 内核问题调试手段——QEMU 专题

VM 启动后没有输出?莫慌~ 一般而言,在运行 qemu-system-xxx 启动虚拟机后,我们希望在主机的当前终端上看到内核的启动日志,并在虚拟机启动后用该终端直接操作虚拟机。然而有时,当前终端在运行了 qemu-system-xxx 后却毫无动静。此时,在确认内核可以正常启动的前提下,要去确认几件事情: 当前终端对 QEMU 虚拟机而言是什么设备; 当前内核使用的 /dev/console 指向了哪个设备。 先找到一个可用的虚拟机终端(比如通过 VNC 连接的方式),然后向 /dev/{console,tty{,S}{0,1,...}} 等物理终端设备文件逐个尝试输入一些内容,看看哪个文件能让主机的当前终端有输出1。确定了是哪 …

基于完整发行版搭建内核验证环境

0x01 虚拟机(VM)安装及启动 1. 选择一个发行版,下载其安装镜像 选择格式为 .iso 的安装镜像进行下载。 2. 制作根文件系统(rootfs)镜像 总体思路:启动一个 QEMU 虚拟机,以 rootfs 镜像文件为硬盘,以安装镜像 iso 文件为光盘。设置虚拟机从光盘启动,将系统安装至硬盘。 1# create an empty rootfs image file 2qemu-img create -f qcow2 rootfs.qcow2 128G 3 4# boot from CD-ROM, so that OS can be installed into the rootfs image …

ELF 调试器示例代码

这份调试器的示例代码来自《Learning Linux Binary Analysis》 书中第三章的“A simple ptrace-based debugger”一节,添加了一些调试打印和关于代码细节的注释。其他相关内容可查阅此书。 1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <unistd.h> 5#include <fcntl.h> 6#include <errno.h> 7#include <signal.h> 8#include …

向 Linux 内核社区提交补丁的流程

制作补丁 下载代码, 如 linux-next 仓 : 1git clone https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 编辑文件,git diff 查看修改的内容。 添加文件到工作区: 1git add <file> 生成 commit(-s 添加 Signed-off-by): 1git commit -s 编写 Commit Message 的注意事项 补丁的标题要合适,可以使用 git log 参考已有补丁的标题;标题要反映补丁实际修改,避免太抽象或空乏。 Commit Message 要写清楚问题,根因分析,以及解决方 …