高分求助:一个奇怪的问题

hzhiyang84 2009-04-16 03:11:29
我的程序里会调用到一些菜单
程序开始运行时正常,使用按键使菜单显示出来可以正常显示,而且此后过不久按一次就不会出错,
但是,如果等很久之后再按一次就会出错,比如死机,显示不正常。

我跟踪了下,程序到某个函数后死掉了,
我在该函数前将该函数要用到的各个参数打印了一遍,发现和正常时值是一致的,函数的地址也一致。

另外我还在这个函数的 最开始处 加入了打印信息,发现该打印信息没有被打印。

我用的是51为内核的单片机,
是堆栈满了?内存泄漏?
大家帮忙分析下可能的原因和解决思路,非常感谢!
...全文
331 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairchild811 2009-04-16
  • 打赏
  • 举报
回复
单独把这个函数拎出来run一下,看看有没有问题
turbocamel 2009-04-16
  • 打赏
  • 举报
回复
函数是否入栈了?如果函数入栈了那就看看函数内部是否存在大块的静态内存(静态数组之类的)
hjjdebug 2009-04-16
  • 打赏
  • 举报
回复
大事化小,小事化了。
把你的代码先删一半,(在不影响测试的情况下),正常不?
再删一半看看,正常不?
再删一半看看,正常不? 。。。
用不了几次,删的代码就剩3.5条了。 bug在那3,5条指令上,还看不出来吗。

哦! 最后可能是中断出了问题,那这方法不灵了,另想办法吧。考验你的时候到了。
qwerty1231 2009-04-16
  • 打赏
  • 举报
回复
顶。多半是没运行到那函数就甭了。
WOBUGUAN 2009-04-16
  • 打赏
  • 举报
回复
如果不涉及公司机密的话,也麻烦在解决以后说明一下是什么问题。

如果没有仿真器,看一下汇编代码也可能会有帮助的
hzhiyang84 2009-04-16
  • 打赏
  • 举报
回复
谢谢大家提出的各种建议,我将会在这个问题解决后结贴,
并将会给分给比较有参考价值的帖子!!!!!!!!!!!!!!!
suners 2009-04-16
  • 打赏
  • 举报
回复
ffffffffffffffffffffddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
douchog_13k 2009-04-16
  • 打赏
  • 举报
回复
可能是栈溢出,你可能是在栈里面申请了大的东西,看看你程序里有没有要占用内存很大的量
WOBUGUAN 2009-04-16
  • 打赏
  • 举报
回复
你的可执行文件一共有多大?
hzhiyang84 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaocha 的回复:]
得到键值并执行个函数

你的问题是等了长时间,才会出问题,
也就是还没有得到键值就有问题了,或者说就有隐患了,
所以说,不一定是这个函数有问题,仔细看我写的第2条
[/Quote]

有道理,其实即使我测出来这个函数执行过程中是什么直接原因导致死掉也没有能解决问题。
最终还是要去找为什么长时间才出这个问题。
谢谢!
wanglllmn 2009-04-16
  • 打赏
  • 举报
回复
dddd
xianyuxiaoqiang 2009-04-16
  • 打赏
  • 举报
回复
恩,没调这个函数就已经崩溃了。
WOBUGUAN 2009-04-16
  • 打赏
  • 举报
回复
被调用的函数申请了很多局部变量吗?
除了堆栈溢出,也可能是执行指令时出现了异常
xiaocha 2009-04-16
  • 打赏
  • 举报
回复
得到键值并执行个函数

你的问题是等了长时间,才会出问题,
也就是还没有得到键值就有问题了,或者说就有隐患了,
所以说,不一定是这个函数有问题,仔细看我写的第2条
hzhiyang84 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaocha 的回复:]
51单片机,

1 要确定是否是硬件问题,造成的程序跑飞、死机(如电源、外部干扰等)
2 仔细检查等待按键的时间,你的程序在干什么,中断及与时间有关的东西要特别注意
3 你说的函数无代码,不好判断,但你说参数没有问题,那就可能使与全局变量、MCU的功能寄存器、端口有关了
4 如果错误可以重现,不停的输出运行位置和主要变量,定位出问题的地方

这样复杂的问题,最好用仿真器调试。
单片机软件调试是很麻烦…
[/Quote]
非常感谢!
按键响应后,得到键值并执行个函数,

函数的所有参数打印得到的值都是和正常时一致的。
我们这边没有仿真器,只能靠打印信息。
我怀疑是堆栈满了,正在测试!
zgjxwl 2009-04-16
  • 打赏
  • 举报
回复
你要是用的malloc,用它和NULL比较一下。
malloc在分配不成功的时候会返回NULL值

另外,你可以google下如何检测内存是否泄露
bolognagene 2009-04-16
  • 打赏
  • 举报
回复
是不是哪里内存分配了没有释放 一直在申请 最终内存不足?
xiaocha 2009-04-16
  • 打赏
  • 举报
回复
51单片机,

1 要确定是否是硬件问题,造成的程序跑飞、死机(如电源、外部干扰等)
2 仔细检查等待按键的时间,你的程序在干什么,中断及与时间有关的东西要特别注意
3 你说的函数无代码,不好判断,但你说参数没有问题,那就可能使与全局变量、MCU的功能寄存器、端口有关了
4 如果错误可以重现,不停的输出运行位置和主要变量,定位出问题的地方

这样复杂的问题,最好用仿真器调试。
单片机软件调试是很麻烦的事情,要有耐心。
hzhiyang84 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zgjxwl 的回复:]
你在进入函数那里。。测试一下,看内存是否分配成功了
[/Quote]

这是个好的思路,有什么方法来看内存分配是否成功吗?谢谢!

假设函数为 void func( int a ,int b ,int c){....}
zgjxwl 2009-04-16
  • 打赏
  • 举报
回复
你在进入函数那里。。测试一下,看内存是否分配成功了
加载更多回复(10)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧