MIPS的栈回溯实例
1. 使用i命令查看需要回溯的任务ID
选择任务tNetConf的任务id: 0xc1c747d0
2. 使用ti命令查看任务信息(ti 0xc1c747d0)
主要是获取sp栈地址和sp栈大小,pc和ra的值
SP:0xc1c76030 SP大小6144
pc = c04789e4
ra = 0 (一般情况下不是0,我这里刚好是)
3. 使用d命令查看SP栈中的内容(d 0xc1c76030,128,4这里只查看128个单位的大小,总大小不要超过SP大小6144就可以了)
将第三列中c0xxxxxx中的地址找出来,顺序不要改变(为什么选择第三列和选择c0开头的地址,后面再详细说明)

4. 使用反汇编命令,但记得添加-D选项(objdumpmips.exe –xthD vxWroks > vxWroks.txt)
命令工具在以下目录C:\WindRiver\gnu\4.3.3-vxworks-6.9\x86-win32\bin

上图只是使用PC:c04789e4做的示范,使用文本的搜索功能,找到函数地址,然后向上找到函数名,其他地址也是类似(如果遇到不能找到的地址或者可以找到地址但是向上不能找到函数名的可以直接跳过此地址)
- pc c04789e4 semBTake
- ra 0 跳过
- c047a438 semTake
- c0620b1c ipcom_block_wait
- c07598b8 ipnet_pipe_recv_with_tmo
- c0759948 ipnet_pipe_recv
- c05f2874 ipnet_usr_sock_pipe_recv
- c05f4554 ipnet_usr_sock_wait_until
- c05f4798 ipcom_recvmsg
- c05f48c4 ipcom_recvfrom
上面是根据第3步中的地址找出来的函数,函数的调用关系为
ipcom_recvfrom ---> ipcom_recvmsg--->
ipnet_usr_sock_wait_until---> ipnet_usr_sock_pipe_recv--->
ipnet_pipe_recv---> ipnet_pipe_recv_with_tmo---> ipcom_block_wait--->
semTake---> semBTake
以上是回溯的基本过程,如果回溯RTP或者有动态库之类的会稍微麻烦一些。
MIPS栈回溯的原理
(以后更新)


2292

被折叠的 条评论
为什么被折叠?



