This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

调试中的问题(堆栈溢出,形参传递)



各位专家:

 

       在调试中经常出现一点改动,重新编译后,程序运行结果不正确的现象(与改动处无关)

        例如   1. 形参传递不正确,形参指针取址传递时带入的地址不正确(地址单字节)。

                  2. 赋值语句不正确(参数无法赋值)

                  3. 子函数调用不正确(进入不了子函数)

        诸如此类与程序代码预想不一致的编译结果,rebuild后可能问题就没有了,怀疑是堆栈溢出的问题,但是查看map文件修改堆栈大小都无法定位问题到底出现

在哪,请各位专家指导一下,出现此类问题的原因该如何定位?堆栈溢出的问题有没有什么中断或寄存器可以直接定位?

 

   

   

  • 你说的这些现象是使用CCS单步跟踪代码运行发现的么?

    堆栈溢出是一个软件行为,没有专门的寄存器可以观察。你可以在明确堆栈其实地址后,在memory窗口看看栈顶位置有没有非法改写的痕迹来判断。

    同时检查一下自己的函数中有没有定义特别大的局部变量,尤其是数组。

  • 您好:

             以上问题是在单步跟踪代码发现的。我现在的栈开的挺大的(0x15000),程序中确保没有大数组,累加数组也有越界保护。

             发现错误在程序build的情况下出现比较多,rebuild或者clean以后再build出错的概率较小,也出现过。不知和编译器版本有没有关系,我们现在主要还在用

    5.1,5.2和5.3的版本,不知会不会有影响。

             为了8核并行方便,我把堆栈和全局变量都放在L2中,但是L2 不能用的太多,少于0x10000就容易出问题,后续准备在栈顶设置一个标志,赋特殊值检测一下。

    请问除了堆栈问题还有其他需要注意的地方吗??谢谢!!!

  • 从你描述的现象看,不一定是代码存在问题。
    如果代码采用O3优化的话,单步运行的时候可能出现你所说的问题。

    建议你看看程序实际运行的结果是不是正确,或者先不加优化编译,并增进-g编译选项,再单步运行看看。