【发布时间】:2012-03-29 13:23:51
【问题描述】:
我正在用 C 为嵌入式设备(STM32)编写一个可执行文件。经过一些调试,我将其简化为这个函数:
char * parse(char * start)
{
int i = 0;
char command[20];
print(start);
}
由于某种原因,当我调用此函数时,参数start 已损坏。现在,如果我注释掉 command 初始化,我可以让它工作:
char * parse(char * start)
{
int i = 0;
// char command[20];
print(start);
}
注释掉command,一切正常。我可能会用完内存。但是这个程序很小,通过检查堆栈指针寄存器,我可以确认我还有很多 RAM 空间。
这里可能出了什么问题?一个损坏的编译器? (我正在为 ARM 使用重新编译的 GCC 版本,称为 Yagarto。)
【问题讨论】:
-
print()是做什么的?我怀疑您的错误可能在其中(或者它正在输入它无法处理的输入)。 -
请注意
parse()的返回类型为char*,但return没有任何内容。 -
有些东西正在破坏堆栈。当您注释掉
command时,您正在注释掉堆栈上 20 个字节的分配,这意味着您的堆栈粉碎代码可能会在一些不同的内存位上呕吐。发布print()的代码。我认为错误就在那里。 -
我猜你应该分享你的
print实现,除非它太大了。 -
@Randomblue - 理想情况下显示所有代码。如果它很大,您可以使用 pastebin 或 github 上的 gist。它极不可能是编译器。如果您想减少这种可能性,请下载 LeafLabs Maple IDE,并使用埋在其中的 gcc toochain。 gdb 是否适用于您的系统?如果是这样,请在开始时设置数据监视。