前言
今天分享一篇AUTOSAR架构下软件调试的文章,文章来源于网络。
正文
工欲善其事必先利其器。
AUTOSAR工程如此庞大的代码量,如果没有一个科学、程式化的方法来调试程序, 那么程序跑飞之后使用三板斧:打断点、看变量、对比正常代码和异常代码的变动,这显然是不能够胜任工作的。
遇到一些程序跑飞,因为没有科学的方法做指导实在解决不了,只能选择绕过、挖坑给下一代人。
Bug太多,上帝说,让刺叔去吧,给你们填坑,给你们带去先进的方法!
目录
1.ErrorHook的使用
2.Det的使用
3.PC指针的使用
首先,说一下我总结的程序调试的几种方法。
跑飞后软件调试方法
1. ErrorHook: 极少数情况可用。
2. Det: 报的信息太过笼统,有一定的作用。
3. PC指针: 可以精确定位到某一行,但仅限开发阶段可用。
1. ErrorHook的使用
在OS_Callout_Stubs.c下面的函数,FUNC(void, OS_ERRORHOOK_CODE) ErrorHook(StatusType Error),这里面打断点。
如果程序真的进了ErrorHook,可以从CurrentError里面来捕获这个错误ID。怎么样破解这个ErrorID的具体含义?
最快捷的方法是,转到Os_Types.h中,在Os_StatusType这个enum的注释下面有对ErrorID的解释。
2. Det的使用
方法类同ErrorHook的使用。但要注意:
要观察哪一块的错误,就要使能那一块的DET,比如,你的工程一进行ADC采集就跑飞,那么你必须要打开ADC模块的DET功能,和DET模块。这样你才能观测DET错误信息。
然后在Det.c模块的Det_ReportError进行错误信息的捕获。该函数中最有用的信息就是这4个参数:ModuleId、InstanceId、ApiId、ErrorId(也叫ErrorCode)。
关于ModuleID的定义,是AUTOSAR标准,所有SIP供应商都遵循的,在AUTOSAR标准《List of Basic Software Modules 》中可以查到。
在定位到Module以后,可以在每个Module的头文件代码下面或者TechnicalReferences下面(仅适用于Vector的工具)找到具体的ErrorCode/ErrorId的含义。这样就能大体定位出问题所在。
3. PC指针的使用
应对程序跑飞,这是目前博主认为最高效,也是博主最喜欢用的方法。这种方法几乎可以说是程式化的,其每一步都是固定且目的清晰的。
因为博主没用过其他软件调试工具,所以我还是给这个方法加一个适用条件,免得误导别人。
编译器:Tasking
调试软件:TRACE32
调试硬件:劳特巴赫
芯片平台:英飞凌AURIX系列
先说一下这个方法的原理,就是上下文切换机制。关于英飞凌CSA,网络上有不少讲解,可以参考一下这篇博文《TriCore处理器的上下文切换原理》。程序运行过程就是一个上下文的链表延伸的过程,这个链表的节点中记录着当前位置和历史位置。
好了,言归正传:
第一步:在TRACE32中,打开CPU/CSFR这个模块。
观察PC指针这个寄存器,是不是固定在某一个值不变,或者在某一个非常小的范围内跳动。
如上图,这个时候程序停在了0x80080098这个位置。
第二步:打开Var/show Function视图。
这个视图里,有所有的函数列表,及他们各自对应地址区间,左边是函数名,右边一列是地址:
结合第一步中的0x80080098,找到该地址属于哪个函数。注意在“Find”窗口中最好不要直接搜索80080098,因为这是函数内的一个指令对应的地址,不一定恰好是函数边界地址。一个函数对应的是一个地址区间,所以可以按地址范围搜索,比如搜索800800,然后在搜索出来的结果中找到正确的0x80080098所在区间,即所属函数。
第三步:找到PC指针停在的哪个函数,然后在函数内部(比如第一条语句处)打断点。打断点之后重新运行程序,这个时候程序必然会停在断点处。
Note: 上图地址只作为示意,博主在家里写的博客,没有劳特巴赫,无法展示真实的调试过程。
第四步:打开Var/show Stack视图。
你会发现在程序跑飞之前的函数调用关系尽收眼底。那么是谁引起的跑飞,就一目了然。注意:在STACK视图中越是靠上的函数越是时间上靠后的。即程序是从下面的函数调用上面的函数这样跳转的。
比如我们前期已近明确,一旦使能XCP功能,程序就跑飞, 那么在Stack视图中显示,XCP模块的最后一个函数是Xcp_CmdHlp_WriteMta(),那么我们就进入该函数,通过单步调试,定位出到底哪一行代码执行导致了程序进入Trap。
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
注:本公众号文章中使用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...