某软件在服务器运行,概率性出现死机问题。
可以看到是nlk这个结构体中的“cb_mutex”成员作为“mutex_lock”函数的入参。
可以看到“cb_mutex”在结构体变量nlk中的偏移是920。
看到有汇编操作ldr x0, [x0, #920],结合上面分析,该处就是将地址从nlk的初始地址,移动到其成员变量“cb_mutex”中。因此在该命令前x0寄存器存储了nlk的初始地址。但此时仍不知道到x0寄存器的值是多少。但可以从前面汇编操作mov x19, x0看到,寄存器内容被拷贝到x19中。根据x19寄存器的特征,x19寄存器的值,将在子函数“mutex_lock”调用时保存。
1 2 | crash> rd 0xffff00089a9efaf0 ffff00089a9efaf0: ffffa05fc828f800 |
1 2 | crash> struct netlink_sock.cb_mutex ffffa05fc828f800 –x cb_mutex = 0xffff000008e6e7b0 <rtnl_mutex> |
1 | crash> struct mutex 0xffff000008e6e7b0 –x |
确认锁的持有者为0xffffa03b9dd80000(因为最后三位是标志位,并非实际锁持有者地址,最后三位赋值为0)。