1、选择要打断点的代码行,或在Memory中选中某一个要监测的数据,点击右键->Set Data Breakpoint:
2、在弹出页面选择该Data断点实现的条件,例如该Data的读、写,或者可以在Conditions中设置断点产生条件,如Data == 100时进入断点。以及通过Action 在断点执行时产生相应的动作。
如果断点已经执行完,还想继续跳到该断点,或者想手动执行到某行代码,可以在断点处右键,选择Set next statement
1、右键工程目录选择Options:
2、依次选择Linker -> config,然后点击Edit,选项卡选择Stack/Heap Size,编辑实际堆栈大小:
更改后需要rebuild
在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大小
程序运行中,可以查看Stack的当前占用量,以及总量
在Tools->Option->Stack中勾选如下图:
程序运行时(Debug),选中View->Stack
在程序运行中,打断点或者暂停程序,Stack窗口就会显示栈使用情况,如下图:可以看到当前栈指针位置、(该断点时刻栈的使用情况)、当前栈空间内容及地址、全部已使用的Stack空间、以及未使用的Stack空间。
关于Stack窗口 可以参考如下:
在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
例如查看某个指针指向的数据内容:
Debug模式下,右键Watch 一个char *的指针dataC,这时只能看到指针指向的第一个数据:
同样在View菜单下,点击Memory1,将dataC指针存放的地址放到Goto的内容栏中,即可查看数据内容:
通过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
IAR中使用.icf文件 划分存储资源
.dep文件
ide所使用的文件依赖信息,这个会自动生成的,可以删掉
.ewp文件
工程文件/project,包含代码,编译,链接选项等,不包含调试设置等信息,这个不能删
.ewd文件
工程调试设置,保存的是IAR设置中的Debugger选项,这个最好不要删
.eww文件
解决方案/工作空间/workspace,可以直接双击打开,可以放多个工程文件,最好也不要删
欢迎转载,Howie原创作品,本文地址:
http://blog.csdn.net/HowieXue/article/details/80381023
谢谢