crash 调试vmcore

本文探讨了如何利用crash工具分析和调试vmcore文件,包括如何生成vmcore及其在排查系统崩溃问题中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看vmcore.

vmcore 的生成

echo c >/proc/sysrq-trigger
会在/var/crash 下产生一个vmcore 文件

vmliux 需要 kernel-debuginfo 和 kernel-debuginfo-common 这两个包(注意kernel版本要对应)
crash vmliux vmcore
<think>我们拥有crash工具和vmcore文件,可以用于分析内核崩溃。以下是调试步骤和关键点: ### 调试步骤 1. **启动crash工具**: ```bash crash vmlinux vmcore # vmlinux是带调试符号的内核镜像 ``` 2. **基本状态检查**: ```bash crash> sys # 检查系统信息 crash> bt # 查看崩溃时的调用栈(最关键的起点) crash> ps # 查看崩溃时所有进程状态 crash> log # 查看崩溃相关的内核日志 ``` 3. **针对崩溃栈的分析**: - 如果崩溃栈指向`handle_pte_fault`,需检查关联的进程内存映射: ```bash crash> struct vm_area_struct <address> # 从栈帧中获取vma地址 crash> vtop <虚拟地址> # 转换崩溃地址006b6b6b...到物理地址 ``` 4. **内存泄漏检测**(如果启用了KMEMLEAK): ```bash crash> kmemleak ``` 5. **安全模块相关分析**: - 定位XPM模块的代码: ```bash crash> mod -s xpm # 检查模块加载地址 crash> dis <函数地址> # 反汇编get_exec_file_signature_info等函数 ``` 6. **驱动问题排查**: - 检查`sd77122`驱动的状态: ```bash crash> struct i2c_client 0x... # 从日志中获取设备地址 ``` ### 关键分析目标 1. **崩溃点定位**: - 从`bt`输出中找到触发页错误的指令位置(PC寄存器值) - 使用`dis`反汇编该地址附近的代码 2. **内存内容验证**: ```bash crash> rd <地址> 10 # 查看内存原始数据(如0x6b6b6b...区域) ``` 3. **进程上下文**: - 确定崩溃进程`malloc-multi-th`的内存操作: ```bash crash> task <PID> # 获取进程结构 crash> set # 切换到该进程上下文 crash> files # 查看打开的文件(是否涉及mmap) ``` ### 示例分析命令 假设崩溃栈显示: ```plaintext #10 [ffffffc0139f3c70] handle_pte_fault at ffffffc00848a80c ``` 执行: ```bash crash> dis ffffffc00848a80c # 反汇编该函数 crash> struct pt_regs ffffffc0139f3c70 # 查看寄存器状态 crash> vtop 0x006b6b6b6b6b6b93 # 转换触发地址 ``` ### 预期修复方向 - 若`vtop`显示地址无效,证明是野指针访问 - 若关联的`vm_area_struct`为空,说明内存已释放 - 反汇编代码可能暴露安全模块或驱动的内存操作错误 §§相关问题§§ 1. 在crash工具中如何验证触发页错误的虚拟地址是否属于用户空间? 2. 如何通过vmcore分析kmemleak检测到的内存泄漏点具体位置? 3. 反汇编XPM安全模块函数时,如何定位其代码段在vmcore中的地址? 4. 如何确定崩溃时进程`malloc-multi-th`是否正在执行内存分配/释放操作? 5. 在sd77122驱动频繁出现I2C错误的情况下,如何检查其I2C适配器的状态?</think>掌握了 `crash` 工具和 `vmcore` 后,可按以下流程进行内核崩溃调试: ### 调试流程(使用 crash 工具) ```bash # 启动调试会话(需 vmlinux 带符号的内核镜像) crash vmlinux vmcore # 1. 查看崩溃基本信息 crash> sys crash> version crash> mod # 2. 分析崩溃进程(PID:2442) crash> ps | grep 2442 crash> bt 2442 # 3. 检查关键内存地址 crash> vtop 0x006b6b6b6b6b6b93 # 转换故障地址 crash> kmem -x <address> # 检查内存内容 # 4. 查看内核日志 crash> log -m 200 # 显示最后200行日志 crash> log -t "handle_pte_fault" # 按关键字过滤 # 5. 检查内存分配信息 crash> kmem -i # SLAB分配统计 crash> kmem <address> # 特定对象详情 ``` ### 关键分析步骤 1. **定位崩溃点**: ```bash crash> dis -l handle_pte_fault+0x90 # 检查反汇编代码,定位具体指令 ``` 2. **分析内存状态**: ```bash # 检查 X8 寄存器值 (0x6b6b6b...) crash> rd 0x6b6b6b6b6b6b6b93 10 # 若显示 "READ ERROR",证明非法访问 ``` 3. **安全模块排查**: ```bash # 找到 XPM 模块基地址 crash> mod | grep xpm # 反汇编可疑函数 crash> dis <xpm_base+offset_of_get_exec_file_signature_info> ``` 4. **驱动问题诊断**: ```bash # 查找 sd77122 驱动结构 crash> struct i2c_client | grep sd77122 # 检查 I2C 适配器状态 crash> struct i2c_adapter <address_from_dmesg> ``` ### 调试技巧 1. **内存泄漏检测**(若启用 KMEMLEAK): ```bash crash> kmemleak # 定位未释放的内存块 ``` 2. **进程内存映射分析**: ```bash crash> vm -p 2442 # 查看进程2442的内存映射 crash> files 2442 # 检查打开的文件描述符 ``` 3. **寄存器上下文检查**: ```bash crash> set -p 2442 # 切换到进程上下文 crash> p $x8 # 查看寄存器值 ``` ### 分析要点 1. 验证 `0x6b6b6b...` 地址是否属于: - 已释放的 SLAB 对象(`kmem -s`) - 用户空间地址(`vtop` 转换失败) 2. 检查安全模块是否在崩溃前执行: - 在日志中搜索 `xpm_report_security_info` - 分析 `elf_file_enable_fs_verity` 调用栈 3. 确认 I2C 错误是否关联: - 比对 I2C 错误时间戳与崩溃时间 - 检查 `sd77122_read_data` 的调用路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值