最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

ADS调试程序时进入死循环

工作和技术 crifan 2028浏览 0评论

[现象]

在用ARM的ADS调试的时候,在调试某一行看起来极其简单,应该不会出错的程序时候,按F8希望进入该函数,但是整个程序却死了,中断运行,显示的信息如下所示:

DBE Warning 00056: The statement into which was stepped is singular (i.e. it has no exit)

经过调试,最终发现,是在执行此行程序之前,由于申请emWin的Memory Device,也就是申请一块内存的时候,由于堆内空闲空间不够,所以申请失败,所以获得的该memdev的指针也就为NULL了,而接着的memset操作,导致清空了不该清空的内容,好像是清空了0x0002C或者0x0000,往后一段空间,主要是中断向量表之类的内容,因此,在下面的执行之前,栈内的各个变量,如堆栈指针sp内容也都不对了,而且pc的值,也不对了,最后是PC的值为0,因此程序执行了reset,进入了死循环.

[办法]

将emWin的堆的空间大小的宏定义GUI_ALLOC_SIZE加大,重新编译emWin的库

[总结]

1.开始时候,看堆栈的sp有问题,怀疑是堆栈溢出,sp的值应该在0x3065073c -> 0x3064c73c之间,但是此时sp已经是0x00045C之类的值,显然不是溢出,而是被冲掉了.所以继续debug,才知道是申请memdev失败返回memdev指针对空,而后的memset,将0x0002C之后的一段代码清空所导致的问题.

2.以后一定要记住,在申请空间后,一定要判断返回值是否为空.任何一处的返回值判断都不能少,否则就会出现严重时甚至会导致系统崩溃的问题….

转载请注明:在路上 » ADS调试程序时进入死循环

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 看了你的经验总结,也帮我解决了问题,谢谢了,这是我也空间,以后也会把我的经验写上去,希望在技术大家多交流。也请您多多指教
    jyingduan16年前 (2009-05-21)回复
  2. 嗯,说得不错,这就是实践经验啊!
    stars_62516年前 (2008-09-27)回复
82 queries in 0.178 seconds, using 22.12MB memory