• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

栈用完了,没有挂,还在运行

robe_zhang 2018-10-25 浏览量:725

栈分了 150 字节,全部用完了,没有挂,还在运行,如下图 ledr 的任务,把栈一点点往下调 145,140,135,130,还能运行,128 只能运行 3 秒,死了。

这个栈好神奇,分配的不够用了,也不挂,为啥

1.png


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 超一部分能用是不安全的,这时候你的栈指针已经指向外面了,虽然说只要不修改关键的数据就能运行,但是这样的操作还是很不安全(因为你不确定是否指向关键的数据部分)
    • 发布于 2018-10-25
    • 举报
    • 评论 2
    • 0
    • 0
robe_zhang 回复了 奇迹12:我又想到一个可能,系统系统使用的存储区域是对齐的,如果我分配 129字节,可能系统预留了分配 256字节,129属于任务,其他127是空闲的,不会再分配给任何任务了。所以可以用,不会出问题,不用也没关系。 回复
奇迹12 回复了 奇迹12:这个应该不会。。我记得m内核一般是4字节对齐,你这应该是恰好指到不重要的数据上了 回复

其他答案 数量:6
  • 任务堆栈分配150,虽然是用完了,但是任务运行时用不了那么多,一部分是冗余的,所以不会死机,当小于一定值时就会出错死机啦
    • 发布于2018-10-25
    • 举报
    • 评论 1
    • 0
    • 0
robe_zhang 回复了 yhj416606438 :有数据么,有事实么,有代码么? 回复

  • 只有你用到了其他代码的空间才有可能造成死机
    • 发布于2018-10-25
    • 举报
    • 评论 1
    • 0
    • 0
robe_zhang 回复了 @曲终人散@ :150已经用完了,我设置 145 时候,已经用超 5 字节了,甚至用超 20 字节了,也没事 回复

  • 栈用完会继续生长,覆盖相邻任务栈的栈底,相邻任务栈的关键数据没被破坏的时候是可以继续运行的,但死已成为必然。
    • 发布于2018-10-25
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个栈是占用了一块指定的内存区域,只是栈底的地址被指定了,然后它会不停生长,直到占用了别的任务的栈,就会出现错误
    • 发布于2018-10-29
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是你的指定的栈区域被用完了,系统的栈位应该还是有资源的
    • 发布于2018-11-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 堆栈可以溢出了,但是程序还没有停止导致的
    • 发布于2018-12-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

栈用完了,没有挂,还在运行