zoukankan      html  css  js  c++  java
  • 内核调试--确认结构体的size和结构体成员的偏移

    背景

    内核发生了非法地址访问产生了panic;根据panic信息拿到了发生panic的异常指令发生的虚拟地址;根据异常指令地址和内核镜像vmlinux可以找到对应的内核代码位置(可以精确到某个文件的某一行),然后就开始反汇编,对寄存器,查看是访问哪个变量出了问题。

    在这个过程中经常要去计算一个结构体中某个成员的偏移,而有些成员又是一个结构体,又或者结构体中有些成员会根据内核配置的差异而导致其size不同,这个时候就需要去确认发生了panic的内核运行过程中这个结构体中的成员的偏移究竟是多少。在没有生成kdump的情况下(例如,一些嵌入式单板资源有限),如何确认呢?

    解决方法

    使用gdb+vmlinux可以确认。

    示例1:查看随配置不同而size不同的类型运行时的实际size

    通过p sizeof(type)命令即可实现该目标:

    • 第一步:gdb加载vmlinux
    gdb vmlinux
    • 第二步:
    (gdb) p sizeof(spinlock_t)
    $1 = 2

    示例2:想知道某个成员的在结构体中的偏移,如想知道struct worker结构体中成员worker.flags的偏移,可以使用gdb如下方式获取:

    (gdb) p &(((struct worker*)0)->flags)
    $14 = (unsigned int *) 0x68 <irq_stack_union+104>

    这个操作原理是借鉴内核container_of来实现的.

  • 相关阅读:
    JS字符串之字符方法
    JS数组之归并方法
    JS数组之迭代方法
    JS数组之位置方法
    JS数组之操作方法
    【Vue-入门笔记-3】
    【Vue-入门笔记-2】
    阿里靠什么武功秘籍渡过“双十一“的天量冲击
    CC++ --- 线性表-学生成绩管理系统
    TortoiseSVN 使用教程
  • 原文地址:https://www.cnblogs.com/liuhailong0112/p/14896927.html
Copyright © 2011-2022 走看看