如何测量堆栈消耗的内存量?



使用 Lauterbach TRACE32,如何测量应用程序运行时堆栈消耗的内存量?

我在PowerPC CPU上使用AUTOSAR OS。

如果您想知道任务堆栈消耗的内存,我认为最简单的方法是查阅窗口TASK.STacK.view。 确保满足以下条件才能TASK.STacK.view正常工作

  • 设置调试器的操作系统感知(加载 ELF 后),TASK.ORTIAUTOSAR 或TASK.CONFIG任何其他目标操作系统。
  • 使用魔术模式初始化任务的堆栈,这可以在操作系统的启动代码中或使用TRACE32Data.Set命令完成。
  • 如果操作系统感知未检测到,则可能使用命令TASK.STacK.PATtern向调试器声明魔术初始化模式。

如果您想知道裸机应用程序堆栈消耗的内存,则必须通过 PRACTICE 脚本进行检查。

这里的基本思想是使用固定模式初始化堆栈(在应用程序启动之前),然后检查堆栈中哪个百分比不再包含初始化模式。

您可以通过以下三个步骤执行此操作:

首先,在像这样加载 ELF 后,用魔术模式初始化你的堆栈(或者在应用程序的启动代码中这样做):

GLOBAL &lowAddr &highAddr &magicPattern
&lowAddr=ADDRESS.OFFSET(__stack_start)   // assign here the upper border of the addressrange occupied by your stack
&highAddr=ADDRESS.OFFSET(__stack_end)-1  // assign here the lower border of the addressrange occupied by your stack 
&magicPattern=0xCCCCCCCC   // any 32-bit you like which appears unlikely on the used part of the stack 
Data.Set &lowAddr--&highAddr %Long &magicPattern   // initialize the stack

其次,创建一个脚本(stackcheck.cmm)来检查堆栈使用情况,如下所示:

PRIVATE &lowAddr &highAddr &pattern &addr
ENTRY   &lowAddr &highAddr &pattern
IF ("&lowAddr"=="")||("&highAddr"=="")||("&pattern "=="")
(
PRINT %ERROR "At least one of the 3 required parameters is missing"
ENDDO
)
VAR.NEWGLOBAL int stacksize=0
VAR.NEWGLOBAL int stackusage=0
&addr=&lowAddr   
WHILE (Data.LONG(D:&addr)==&pattern)&&(&addr<&highAddr)
&addr=&addr+4
Var.Set %SPaces stacksize = (&highAddr - &lowAddr) + 1
Var.Set %SPaces stackusage = (&highAddr - &addr) + 1
Var.View stacksize stackusage (100*stackusage)/stacksize    // Show result
ENDDO

(您可能希望优化搜索堆栈地址范围的方式。

最后调用脚本来检测当前堆栈使用情况,如下所示:

DO stackcheck.cmm &lowAddr &highAddr &magicPattern

如果您想经常检查堆栈使用情况,您可能需要使用MENU.AddTool在 TRACE32 的工具栏中为此创建一个按钮。

最新更新