工欲善其事必先利其器。

AUTOSAR工程如此庞大的代码量,如果没有一个科学、程式化的方法来调试程序, 那么程序跑飞之后使用三板斧:打断点、看变量、对比正常代码和异常代码的变动,这显然是不能够胜任工作的。

遇到一些程序跑飞,因为没有科学的方法做指导实在解决不了,只能选择绕过、挖坑给下一代人。。。

Bug太多,上帝说,让刺叔去吧,给你们填坑,给你们带去先进的方法!

目录

ErrorHook的使用

Det的使用

PC指针的使用


首先,说一下我总结的程序调试的几种方法。

跑飞后软件调试方法
ErrorHook 极少数情况可用
Det 报的信息太过笼统,有一定的作用。
PC指针 可以精确定位到某一行,但仅限开发阶段可用。

ErrorHook的使用

在OS_Callout_Stubs.c下面的函数,FUNC(void, OS_ERRORHOOK_CODE) ErrorHook(StatusType Error),这里面打断点。

如果程序真的进了ErrorHook,可以从CurrentError里面来捕获这个错误ID。怎么样破解这个ErrorID的具体含义?

最快捷的方法是,转到Os_Types.h中,在Os_StatusType这个enum的注释下面有对ErrorID的解释。


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的含义。这样就能大体定位出问题所在。


PC指针的使用

应对程序跑飞,这是目前博主认为最高效,也是博主最喜欢用的方法。这种方法几乎可以说是程式化的,其每一步都是固定且目的清晰的。

因为博主没用过其他软件调试工具,所以我还是给这个方法加一个适用条件,免得误导别人。

编译器 Tasking
调试软件 TRACE32
调试硬件 劳特巴赫
芯片平台 英飞凌AURIX系列

先说一下这个方法的原理,就是上下文切换机制。关于英飞凌CSA,网络上有不少讲解,可以参考一下这篇博文《TriCore处理器的上下文切换原理》。程序运行过程就是一个上下文的链表延伸的过程,这个链表的节点中记录着当前位置和历史位置。

好了,言归正传:

第一步:在TRACE32中,打开CPU/CSFR这个模块,

观察PC指针这个寄存器,是不是固定在某一个值不变,或者在某一个非常小的范围内跳动。

如上图,这个时候程序停在了0x80080098这个位置。

第二步:打开Var/show Function视图

这个视图里,有所有的函数列表,及他们各自对应地址区间,左边是函数名,右边一列是地址:

结合第一步中的0x80080098,找到该地址属于哪个函数。注意在“Find”窗口中最好不要直接搜索80080098,因为这是函数内的一个指令对应的地址,不一定恰好是函数边界地址。一个函数对应的是一个地址区间,所以可以按地址范围搜索,比如搜索800800,然后在搜索出来的结果中找到正确的0x80080098所在区间,即所属函数

第三步:找到PC指针停在的那个函数,然后在函数内部(比如第一条语句处)打断点。打断点之后重新运行程序,这个时候程序必然会停在断点处。

(上图地址只作为示意,博主在家里写的博客,没有劳特巴赫,无法展示真实的调试过程)

第四步:打开Var/show Stack视图,

你会发现在程序跑飞之前的函数调用关系尽收眼底。那么是谁引起的跑飞,就一目了然。注意:在STACK视图中越是靠上的函数越是时间上靠后的。即程序是从下面的函数调用上面的函数这样跳转的。

比如我们前期已近明确,一旦使能XCP功能,程序就跑飞, 那么在Stack视图中显示,XCP模块的最后一个函数是Xcp_CmdHlp_WriteMta(),那么我们就进入该函数,通过单步调试,定位出到底哪一行代码执行导致了程序进入Trap。


AUTOSAR实战教程 - 软件集成调试_程序跑飞一招解决相关推荐

  1. 【跑飞、死机】单片机 msp430程序跑飞原因和解决方式积累

    目录 单片机 msp430程序跑飞原因和解决方式积累 MSP430 数组填充越界引起的栈溢出 导致程序跑飞 [单片机重启]MSP430重启/频繁重启/跑飞 原因分析 单片机 msp430程序跑飞原因和 ...

  2. 单片机长时间程序跑飞_单片机程序跑飞的三种现象、原因及解决方法

    今天在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象.原因及解决方法. 一.数组越界(数组溢出 ...

  3. 教你如何找到导致程序跑飞的指令

    调试嵌入式程序时,你是否遇到过程序跑飞最终导致硬件异常中断的问题?遇到这种问题是否感觉比较难定位?不知道问题出在哪里,没有办法跟踪?尤其是当别人的程序踩了自己的内存,那就只能哭了:( 今天在论坛上看有 ...

  4. MPC5748G开发笔记-----MPC5748G程序跑飞uSDHCDriverIRQHandler

    MPC5748G程序跑飞uSDHCDriverIRQHandler 文章目录 MPC5748G程序跑飞uSDHCDriverIRQHandler 前言 一.跑飞时的状态 二.利用异常中断获取位置 1. ...

  5. C语言 跑飞位置,DSP程序跑飞的问题 - C2000™︎ 微控制器论坛 - C2000 微控制器 - E2E™ 设计支持...

    Other Parts Discussed in Thread:MOTORWARE TI的各位专家大家好: 第一次发帖,请多多包涵.本人使用的是F28027 C2000 Piccolo LaunchP ...

  6. 困扰一周的奇葩bug:重复相似代码多,导致单片机程序跑飞

    今天是个好日子,困扰一周的bug终于解决了,迫不及待将这个奇葩问题分享给各位朋友~ 硬件环境: 国产MCU:华大HC32L130 问题描述: 最近做一款基于Modbus协议的三通道温度采集模块,程序设 ...

  7. 嵌入式开发——程序跑飞原因总结

    前言 在嵌入式软件开发中,程序跑飞是一个比较棘手的问题.为什么说棘手,那是因为当程序跑飞时,往往没有任何错误信息报出来,Log停止的地方通常也不是出现问题的地方,因此这让我们很难定位问题. 基于以上原 ...

  8. 单片机程序跑飞死机的几种原因

    在使用单片机过程中,经常会出现程序运行一段时间后,不能够正常相应的情况.一般分为软件原因和硬件原因,其中硬件原因比较容易查,软件原因就较为复杂. 软件导致单片机死机的原因 1.指针异常 指针未初始化或 ...

  9. java 进程跑飞_RK3288 st7703 mipi屏指令过长,程序跑飞

    CPU:RK3288 系统:Android 5.1 调试 mipi 屏前,先关闭了 uboot 的 logo 显示 rockchip,uboot-logo-on = <0>; 屏调试完成后 ...

最新文章

  1. 不是都需要ARM吗?
  2. git服务器搭建问题
  3. 英伟达Q4净利同比降49%,还能继续躺赚吗?
  4. matlab jdbc mysql_Matlab连接MySQL(ODBC及JDBC驱动)
  5. linux scrapy 定时任务_写爬虫一定要会scrapy?-Python每日3题(爬虫专题)
  6. android 打印流程图,Android实现Activities之间进行数据传递的方法
  7. java中比较两个文件的大小_Java实现获取文件大小的几种方法
  8. 数据分析 | 这个新职业年薪高达49w,作为普通打工人的你眼馋了吗?
  9. “我的一次微软面试经历”
  10. AVAudioRecorder(ios7)
  11. 阿里HR:你会使用selenium爬取工具? 某人:那不是随随便便吗,不止会用 还会爬取掘金小册呢!
  12. 软件开发需要学习哪些技术?
  13. python learning note
  14. Java多线程篇--AQS
  15. 播音气泡音是什么,气泡音怎么学,气泡音怎么练
  16. C++ yaml解析实战暨yaml-cpp库使用(1)认识yaml格式
  17. 3.1 数据报表之Excel操作模块 XlsxWriter
  18. PHP导出Excel方法大全
  19. 计算机二级c内容,计算机二级C语言考试内容大纲
  20. 最强大脑魏郭撕X,理科男与文科生的…

热门文章

  1. 帮我写一份开发小程序的验收报告
  2. 「解决BUG」WIndows 开机进入桌面后一直闪屏刷新,无法打开资源管理器,菜单等界面
  3. windows md5sum
  4. 巴西柔术第五课:过腿
  5. 焊咀、烙铁头基础知识
  6. 【听】国富论,市场经济学开山之作
  7. 线上CPU100%及应用OOM的排查和解决过程
  8. MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结
  9. 用超级简单的C语言实现人机五子棋(键盘控制)
  10. 台式计算机鼠标不动,电脑鼠标不动了按什么键