如何测量堆栈消耗的内存量?
How to measure the amount of memory consumed by the stack?
使用Lauterbach TRACE32,如何测量应用程序运行时堆栈消耗的内存量?
我在 PowerPC CPU.
上使用 AUTOSAR OS
如果您想知道 任务堆栈消耗的内存 我认为最简单的方法是咨询 window TASK.STacK.view
.
确保以下内容使 TASK.STacK.view
正常工作
- 设置调试器 OS 感知(加载 ELF 后),
TASK.ORTI
用于 AUTOSAR 或 TASK.CONFIG
用于任何其他目标 OS.
- 使用魔术模式初始化任务堆栈,这可以在 OS 的起始代码中或使用 TRACE32
Data.Set
命令完成。
- 如果未被 OS 感知检测到,可能使用命令
TASK.STacK.PATtern
向调试器声明魔术初始化模式。
如果您想知道 裸机应用程序 的堆栈消耗的内存,您必须通过 PRACTICE 脚本进行检查。
这里的基本思想是用固定模式初始化堆栈(在应用程序启动之前),然后检查堆栈的哪个百分比不再包含初始化模式。
您可以通过以下三个步骤完成此操作:
1st 在像这样加载 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 的工具栏中为此创建一个按钮。
使用Lauterbach TRACE32,如何测量应用程序运行时堆栈消耗的内存量?
我在 PowerPC CPU.
上使用 AUTOSAR OS如果您想知道 任务堆栈消耗的内存 我认为最简单的方法是咨询 window TASK.STacK.view
.
确保以下内容使 TASK.STacK.view
正常工作
- 设置调试器 OS 感知(加载 ELF 后),
TASK.ORTI
用于 AUTOSAR 或TASK.CONFIG
用于任何其他目标 OS. - 使用魔术模式初始化任务堆栈,这可以在 OS 的起始代码中或使用 TRACE32
Data.Set
命令完成。 - 如果未被 OS 感知检测到,可能使用命令
TASK.STacK.PATtern
向调试器声明魔术初始化模式。
如果您想知道 裸机应用程序 的堆栈消耗的内存,您必须通过 PRACTICE 脚本进行检查。
这里的基本思想是用固定模式初始化堆栈(在应用程序启动之前),然后检查堆栈的哪个百分比不再包含初始化模式。
您可以通过以下三个步骤完成此操作:
1st 在像这样加载 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 的工具栏中为此创建一个按钮。