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

Debugging 如何测量堆栈消耗的内存量?,debugging,stack,trace32,lauterbach,autosar,Debugging,Stack,Trace32,Lauterbach,Autosar,使用Lauterbach TRACE32,如何测量应用程序运行时堆栈消耗的内存量 我在PowerPC CPU上使用AUTOSAR操作系统。如果您想知道任务的堆栈消耗的内存我认为最简单的方法是查阅windowTASK.STacK.view。 确保执行以下操作以获得TASK.STacK.viewworking 使用AUTOSAR的TASK.ORTI或任何其他目标操作系统的TASK.CONFIG设置调试器操作系统感知(加载ELF后) 使用魔术模式初始化任务堆栈,这可以在操作系统的开始代码中完成,也可

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


我在PowerPC CPU上使用AUTOSAR操作系统。

如果您想知道任务的堆栈消耗的内存我认为最简单的方法是查阅window
TASK.STacK.view
。 确保执行以下操作以获得
TASK.STacK.view
working

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


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

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

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

在像这样加载ELF后(或在应用程序的启动代码中执行此操作),首先使用魔法模式初始化堆栈:

其次,创建一个脚本(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

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

您的目标是否使用了操作系统?您使用的是哪种CPU体系结构?@Holger我使用的是多核PowerPC SoC,主核上运行AUTOSAR,从核上没有RTO。我在第
B::&highAddr=ADDRESS.OFFSET(\uu stack\u end)-1
行中得到一个
符号未找到
错误。Sergey,您必须将堆栈占用的上层地址分配给&highAddr。此地址通常分配给应用程序链接器脚本中的符号。在我的示例中,有一个名为_stack_end的调试符号,它指向这个地址。如果堆栈中有一个名为“.stack”的ELF节,那么这些行将是
&highAddr=ADDRESS.OFFSET(sYmbol.SECEND(.stack))
&lowAddr=ADDRESS.OFFSET(sYmbol.SECADDRESS(.stack))
。因此,初始化&lowAddr和&highAddr这两行必须由您自己设置为应用程序堆栈的边界。在这种情况下,它应该是
&lowAddr=ADDRESS.OFFSET(\uu SP\u INIT)-0x10000
&highAddr=ADDRESS.OFFSET(\uu SP\u INIT)-1
在本例中,您使用命令
DO
和空参数调用了脚本stackcheck.cmm。检查
PMACRO
窗口,如果在第一步中声明的全局宏已被删除。或者在调用stackcheck.cmm之前再次声明
&lowAddr&highAddr&magicPattern
。或者直接在stackcheck.cmm中分配值。我感觉您对练习脚本不太熟悉。我建议您至少下载,也许您还应该阅读脚本语言练习的培训手册()。
DO stackcheck.cmm &lowAddr &highAddr &magicPattern