浅析vxWorks系统中如何抓取任务的函数调用轨迹.docVIP

浅析vxWorks系统中如何抓取任务的函数调用轨迹.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析vxWorks系统中如何抓取任务的函数调用轨迹

这几天连续查了几个关于死机、网口死的问题,情况基本上都是任务吊死了,包括大家有时看到的串口和网口都不响应,也往往都是由于任务停止切换而造成的。对于这类问题,我们一般感觉比较棘手,因为一旦网口串口全都拒绝响应之后,整个系统对于我们来说就是一个黑盒了, 程序员坐在显示器前边,只能束手无策望洋兴叹。这里结合我自己的一些经验和所知,试图为大家寻找到一种处理类似问题的思路,希望能够对大家有所帮助。 其实大家都曾经看到过操作系统模块里边os_exc.c这个文件,但许多人并不知道它能够完成的真正功能和工作原理,要弄清楚这些,我们必须先初步了解一下vxWorks系统在函数调用过程中的一些底层实现机制,看看我们如何抓到指定任务的函数调用轨迹的,因为吃透了这些,我们就可以在必要的时候,抓取指定任务的函数调用栈,从而基本可以定位处任务吊死在哪个函数内部了。 首先,PPC有32个通用寄存器(GPRS)和7个专用寄存器(SPRS),这里,作为上层软件的开发人员,大家并不需要去深入了解过多的操作系统细节,也无需对CPU的每个寄存器每根线都了如指掌,而只需将注意力集中在我们所关心的通用寄存器gpr1、gpr3以及专用寄存器lr、pc。它们的重要性是因为:在函数调用过程中,gpr1就是sp,也就是函数的堆栈指针,gpr3是函数调用过程中传参的第一个寄存器(函数实参从gpr3开始顺序存放,如果寄存器放不下了,就会压入堆栈,然后执行跳转指令进入被调用函数,被调用函数再从这些事先约定的寄存器中取出实参进行后续处理,同样,函数的返回值也是存放在r3中的),lr是函数调用过程中的返回指令地址(也就是函数调用点的下一条指令地址),而pc是当前指令地址。 上边的说法可能比较抽象,有些不便于理解,那么我们看下边这个例子代码的汇编结果: int myfunc2(int i) { int j; j = 0; j += i; return j; } int myfunc1() { int i; int j; i = 4 *5; j = myfunc2(i); return j; } 相应的汇编代码如下,莫为乱花迷了眼,我们只需关注红色部分即可: int myfunc1() { 0x167b4 myfunc1: stwu r1, 0xffe8(r1) 0x167b8 +0x004: mfspr r0, LR 0x167bc +0x008: stw r31, 0x14(r1) 0x167c0 +0x00c: stw r0, 0x1c(r1) 0x167c4 +0x010: or r31, r1, r1 int i; int j; i = 4 *5; 0x167c8 +0x014: li r0, 0x14 (20) 0x167cc +0x018: stw r0, 0x8(r31) j = myfunc2(i); 0x167d0 +0x01c: lwz r3, 0x8(r31) 0x167d4 +0x020: bl myfunc2 0x167d8 +0x024: or r0, r3, r3 0x167dc +0x028: stw r0, 0xc(r31) return j; 0x167e0 +0x02c: lwz r3, 0xc(r31) 0x167e4 +0x030: b myfunc1 + 0x34 } 0x167e8 +0x034: lwz r11, 0x0(r1) 0x167ec +0x038: lwz r0, 0x4(r11) 0x167f0 +0x03c: mtspr LR, r0 0x167f4 +0x040: lwz r31, 0xfffc(r11) 0x167f8 +0

您可能关注的文档

文档评论(0)

juhui05 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档