JNH官网

【ARM】Keil MDK在调试模式下查看当前在堆栈上的函数、变量

1、 文档目标

本文旨在为使用Keil MDK(Microcontroller Development Kit)进行嵌入式开发的工程师提供一种详细的指导方法,帮助其在调试过程中确认当前程序运行状态下的函数调用链和局部变量信息。特别是在实时操作系统(RTOS)环境下,开发者需要明确当前任务的执行上下文以及堆栈中的变量分布情况,以快速定位问题并优化代码。

通过本文所述的方法,开发者可以更高效地利用MDK调试工具的功能,提升调试效率,减少因堆栈溢出或函数调用异常导致的系统崩溃风险。


2、 问题场景

在嵌入式开发中,复杂的应用程序通常包含多个函数调用层级,尤其是在引入实时操作系统(如RTX RTOS)后,任务切换和多线程机制使得程序执行流程更加复杂。传统的单步调试方式虽然能够逐步跟踪代码执行,但难以直观地展示当前任务的函数调用关系以及局部变量的状态。

例如,当程序运行到某一点时,开发者可能需要确认以下信息:

● 当前任务的函数调用链是什么?

● 哪些局部变量已被加载到堆栈中?

● 局部变量的值是否符合预期?

这些问题在调试过程中尤为关键,因为它们直接关系到程序的正确性和性能优化。然而,手动分析堆栈信息不仅耗时,还容易出错。因此,如何利用Keil MDK提供的工具快速获取这些信息成为亟待解决的问题。


3、软硬件环境

1)、软件版本:Keil MDK 5.38a

2)、电脑环境:Windows 11

3)、外设硬件:无


4、解决方法

1)、在MDK Debug模式下,有一个Call Stack + Locals窗口,该窗口就是用于显示当前位于堆栈上的对象。对于使用RTX-RTOS的应用程序,会显示任务。每个对象都与其位置或值以及类型相关联。当前函数位于列表顶部,被调用函数位于其下方,并且还会显示当前函数的所有局部变量的信息。(如图4-1)

图4-1

2)、Call Stack + Locals窗口可以通过菜单栏View->Call Stack WIndows打开(如图4-2-1)或者直接在工具栏中点击Call Stack Windows的按钮打开(如图4-2-2)。

图4-2-1

图4-2-2


3)、在程序运行过程中Call Stack + Locals窗口是不会进行更新的,只有触发断点或者程序暂停运行后,才会显示出当前情况下处于堆栈中的函数与对象。(如图4-3)

图4-3


4)、在Call Stack + Locals窗口中一共包含以下的三栏数据(如图4-4):

(1)、Name:显示符号名称。当前活动的功能或任务以绿色突出显示。

(2)、Location/Value:显示该项的内存地址或值,或具有解释性文本。对于unsigned char类型的项,该字段显示值和字符。

(3)、Type:显示对象类型。函数与其返回类型和参数类型相关联。

图4-4


5)、还在通过右键选中对应的函数或者变量,跳转到对应函数的位置或者被调用的位置。(如图4-5)

图4-5


jnh官网 jnh官网 jnh官网 jnh官网 金年会 金年会 金年会 金年会