各位专家:
在调试中经常出现一点改动,重新编译后,程序运行结果不正确的现象(与改动处无关)
例如 1. 形参传递不正确,形参指针取址传递时带入的地址不正确(地址单字节)。
2. 赋值语句不正确(参数无法赋值)
3. 子函数调用不正确(进入不了子函数)
诸如此类与程序代码预想不一致的编译结果,rebuild后可能问题就没有了,怀疑是堆栈溢出的问题,但是查看map文件修改堆栈大小都无法定位问题到底出现
在哪,请各位专家指导一下,出现此类问题的原因该如何定位?堆栈溢出的问题有没有什么中断或寄存器可以直接定位?
Adam Yao94020:
你说的这些现象是使用CCS单步跟踪代码运行发现的么?
堆栈溢出是一个软件行为,没有专门的寄存器可以观察。你可以在明确堆栈其实地址后,在memory窗口看看栈顶位置有没有非法改写的痕迹来判断。
同时检查一下自己的函数中有没有定义特别大的局部变量,尤其是数组。
li yanlong:
回复 Adam Yao94020:
您好:
以上问题是在单步跟踪代码发现的。我现在的栈开的挺大的(0x15000),程序中确保没有大数组,累加数组也有越界保护。
发现错误在程序build的情况下出现比较多,rebuild或者clean以后再build出错的概率较小,也出现过。不知和编译器版本有没有关系,我们现在主要还在用
5.1,5.2和5.3的版本,不知会不会有影响。
为了8核并行方便,我把堆栈和全局变量都放在L2中,但是L2 不能用的太多,少于0x10000就容易出问题,后续准备在栈顶设置一个标志,赋特殊值检测一下。
请问除了堆栈问题还有其他需要注意的地方吗??谢谢!!!
Adam Yao94020:
回复 li yanlong:
从你描述的现象看,不一定是代码存在问题。如果代码采用O3优化的话,单步运行的时候可能出现你所说的问题。
建议你看看程序实际运行的结果是不是正确,或者先不加优化编译,并增进-g编译选项,再单步运行看看。