IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等

目录
1.使用数据断点
2.Set next statement 手动执行到某行代码
3.设置堆栈大小
4.静态查看程序Stack栈使用详情,以及栈深度
5.动态查看程序运行Stack占用情况
6.Call stack查看当前栈空间
7.使用Memory查看程序运行中各种过程数据
8.IAR Map文件解析堆栈信息
9.IAR xx.icf存储资源文件解析
10.IAR各编译文件含义
1.使用数据断点:
1、选择要打断点的代码行,或在Memory中选中某一个要监测的数据,点击右键->Set Data Breakpoint:

2、在弹出页面选择该Data断点实现的条件,例如该Data的读、写,或者可以在Conditions中设置断点产生条件,如Data == 100时进入断点。以及通过Action 在断点执行时产生相应的动作。


2.Set next statement 手动执行到某行代码
如果断点已经执行完,还想继续跳到该断点,或者想手动执行到某行代码,可以在断点处右键,选择Set next statement

3.设置堆栈大小
1、右键工程目录选择Options:

2、依次选择Linker -> config,然后点击Edit,选项卡选择Stack/Heap Size,编辑实际堆栈大小:

更改后需要rebuild

4.静态查看程序Stack栈使用详情,以及栈深度

在Option->linker中勾选Enable stack usage analysis,之后Rebuild编译完,可以在.map中查找Stack Usage 栈使用分析

举个栗子,上图是在map中找到的STACK USAGE,可以清晰的看到Program程序里使用最大的stack大小为1392bytes, Uncalled function(如中断)使用的stack大小为最大1824bytes和其他所占用的bytes。
所以,程序里要设置比Program 1392+Uncalled Function占用的stack空间才行,否则会导致overwrite或程序跑非等异常。
公式如下;
CSTACK Size >= maxstack(“Program entry”) + totalstack(“interrupt”) + safety margin(100);
Maximum call chain: 最大调用链所占Stack大小

5.动态查看程序运行中Stack占用情况
程序运行中,可以查看Stack的当前占用量,以及总量
在Tools->Option->Stack中勾选如下图:

程序运行时(Debug),选中View->Stack

在程序运行中,打断点或者暂停程序,Stack窗口就会显示栈使用情况,如下图:可以看到当前栈指针位置、(该断点时刻栈的使用情况)、当前栈空间内容及地址、全部已使用的Stack空间、以及未使用的Stack空间。

关于Stack窗口 可以参考如下:


6.Call stack查看当前栈空间,既此时正在执行的函数及Context:
在Debug模式下,IAR菜单栏选择View -> Call Stack,执行到某一断点,或者程序暂停时,就可以清晰的看到当前时刻的栈空间信息,既所调用的函数等信息


好多攻城狮都会有疑问,这里多说明一下,什么是Call Stack:
Call Stack:调用堆栈,(当前函数执行过程的空间展示)
当发生函数调用的时候,栈空间中存放的数据是这样的:
1、    调用者函数把被调函数所需要的参数按照与被调函数的形参顺序相反的顺序压入栈中,即:从右向左依次把被调函数所需要的参数压入栈;
2、    调用者函数使用call指令调用被调函数,并把call指令的下一条指令的地址当成返回地址压入栈中(这个压栈操作隐含在call指令中);
3、    在被调函数中,被调函数会先保存调用者函数的栈底地址(push ebp),然后再保存调用者函数的栈顶地址,即:当前被调函数的栈底地址(mov ebp,esp);
4、    在被调函数中,从ebp的位置处开始存放被调函数中的局部变量和临时变量,并且这些变量的地址按照定义时的顺序依次减小,即:这些变量的地址是按照栈的延伸方向排列的,先定义的变量先入栈,后定义的变量后入栈;

所以,发生函数调用时,入栈的顺序为:
  参数N
  参数N-1
  参数N-2
  …
  参数3
  参数2
  参数1
  函数返回地址
  上一层调用函数的EBP/BP
  局部变量1
  局部变量2
  …
局部变量N

7.使用Memory查看程序运行中各种过程数据
例如查看某个指针指向的数据内容:
Debug模式下,右键Watch 一个char *的指针dataC,这时只能看到指针指向的第一个数据:

同样在View菜单下,点击Memory1,将dataC指针存放的地址放到Goto的内容栏中,即可查看数据内容:


8.IAR Map文件解析堆栈信息:
通过Option->Linker勾选 map,则编译后会生成.map文件,包含了项目各种编译信息,如下图:

编译后,在编译目录中/list/文件夹中,找到并打开.map文件,文件最上面可以看到编译时间、Linker的版本、编译的程序文件等,

堆栈信息都在"PLACEMENT SUMMARY" 的"P2"中,我们向下拉,找到"P2"最后一个part,可以看到堆Heap 栈Stack的起始地址

再往下ENTRY LIST之后就是程序中各种函数/变量编译的信息:

可以看到函数名,地址等信息,
其中Code Gb代表全局函数:,其中code说明为代码,Gb说明为“全局的”函数(Global)
可以看到除了中断向量表,第一个编译的出的Object文件为 cmain.o,该入口函数位于main.c文件。

静态函数:类型为Code Lc,即静态(局部Local)函数;

全局变量也叫“全局数据”,因为它的类型为“Data Gb”。
(文件内)静态变量:“Data Lc ” 使用static关键字定义的变量,只有在当前文件内使用,所以它属于静态(“局部”Local)变量。

(函数内的)静态变量:定义在函数体内的静态变量,如上图中的,xxx::byteCounter

9.IAR xx.icf存储资源文件解析:
IAR中使用.icf文件 划分存储资源


10.IAR各编译文件含义:
.dep文件
ide所使用的文件依赖信息,这个会自动生成的,可以删掉
.ewp文件
工程文件/project,包含代码,编译,链接选项等,不包含调试设置等信息,这个不能删
.ewd文件
工程调试设置,保存的是IAR设置中的Debugger选项,这个最好不要删
.eww文件
解决方案/工作空间/workspace,可以直接双击打开,可以放多个工程文件,最好也不要删

欢迎转载,Howie原创作品,本文地址:
http://blog.csdn.net/HowieXue/article/details/80381023
谢谢
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值