我们在实际处理稳定性问题的时候,经常会遇到需要把某个task的栈全部dump出来分析的情况,具体可以参考下面的博文:
https://mp.weixin.qq.com/s/aOJw21bFB9f5NsTh43F5cg
那我们应该怎样才能找到task的栈呢,task的stack字段指向的是栈底还是栈顶呢,大小是多少呢,我们下面以arm64为例做一个解析(不同平台栈大小可能不一样)
tsk->stack 是在copy_process->dup_task_struct->alloc_thread_stack_node函数中使用vmalloc申请的,大小是THREAD_SIZE,THREAD_SIZE在arm64中的定义是16k(不开kasan的情况下),转化成16进制是0x4000,tsk->stack指向栈的栈底,也就是说使用vmalloc出来的栈内存地址是直接赋值给tsk->stack字段的。
所以我们在实际dump某个task的栈的时候,应该先找到这个task_struct的地址,假设是A,使用crash工具解析A地址:
在crash工具中输入struct task_struct A
.....
然后找到stack字段对应的值,假设是B。
接下来就可以使用rd命令去直接把这个栈内容全部dump出来:
rd B -e B+0x4000 >mm.txt