在分析死机问题时,经常要阅读汇编代码,局部变量,或者形参经常是结构体指针变量
static inline void
__rb_change_child(struct rb_node *old, struct rb_node *new,
struct rb_node *parent, struct rb_root *root)
{
if (parent) {
if (parent->rb_left == old)
parent->rb_left = new;
else
parent->rb_right = new;
} else
root->rb_node = new;
比如上面的C代码
其中有一行汇编是这么写的
ffffffc00016f598: f9400843 ldr x3, [x2,#16]
根据arm64的寄存器使用原则,x2=parent
那么x2+16是那个成员呢?
比较笨的方法就是不断计算每个成员占用多少空间,复杂结构体容易出错
其实我们可以通过gdb打印出结构体成员变量的offset的方法来定位
如下rb_left的offset=16,所以ldr x3,[x2,#16]一定是取parent->rb_left的值
(gdb) p &((struct rb_node*)0)->rb_left
$4 = (struct rb_node **) 0x10