debugging - 如何衡量堆栈消耗的内存量?

标签 debugging stack trace32 lauterbach autosar

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

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

最佳答案

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

  • 设置调试器操作系统感知(加载 ELF 后),对于 AUTOSAR 使用 TASK.ORTI 或对于任何其他目标操作系统使用 TASK.CONFIG
  • 使用魔法模式初始化任务堆栈,这可以在操作系统的启动代码中或使用 TRACE32 Data.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 的工具栏中为此创建一个按钮。

关于debugging - 如何衡量堆栈消耗的内存量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847142/

相关文章:

algorithm - 使用堆栈打印给定 N 轮 RPS 的可能结果的所有排列

python - 从 Trace32 的 PRACTICE II 脚本分派(dispatch)外部脚本?

Trace32 在窗口的 TEXT 或 HEADER 中使用宏

jenkins - 如何将trace32与Jenkins集成?

java - 如何在尝试调试应用程序时修复 "Could not connect to remote process"?

javascript - 自定义我的对象在 JS 控制台中的显示方式

汇编 (68k) 堆栈操作

c# - 获取第一次异常的行号

c# - Visual Studio 2010 中的线程标记是什么?

c - 为什么 makecontext/swapcontext 不适用于 pthread_mutex_lock/pthread_mutex_unlock