Keil 调试之堆栈溢出调查

在进行嵌入式多任务系统软件开发,可能会出现堆栈溢出的问题,并且该问题可能是随机出现,因此调查较麻烦。借助keil 的数据断点功能,可以轻松找到产生堆栈溢出的位置。

在程序调试时,常规使用的断点是程序断点,本文提到的则是一种数据断点。以下将列出具体的调试方法。

1、任务的堆栈溢出一般是栈底溢出,在编译完成之后。如果堆栈通过固定地址分配,则通过查询keil 生成的.map获取栈底地址;否则需要在任务创建过程中分配的堆栈时获取栈底地址,将堆栈地址变量“pxNewTCB->pxStack”添加到变量监视区。

Keil 调试之堆栈溢出调查

2、在获取到堆栈地址之后,在该变量上单击右键选择“数据访问断点”

Keil 调试之堆栈溢出调查

3、在弹出的对话框中,选中“Write”选项,根据需要设置Count的值。如果stack堆栈在系统初始化时有初始化过程,则需要将该值Count值设置为2,否则一般设置为1即可以捕获程序意外设置该堆栈的位置。

                                              Keil 调试之堆栈溢出调查

 

4、断点设置好之后,就等着堆栈溢出发生了,如果程序意外设置了该数据内容,则程序会停下来,此时即可得到发生堆栈溢出的程序位置,进行展开调查了。

 

在上述操作中,如果堆栈地址通过固定分配。则通过map文件中的变量查询来获取该地址。在命令输入窗口输入命令即可以设置该数据访问断点。

         bs write 0x20002000,1

                       Keil 调试之堆栈溢出调查

 

更多断点的高级应用可以参考另外一篇博文

https://blog.****.net/guangod/article/details/99573665