【发布时间】:2018-08-03 13:33:06
【问题描述】:
我正在使用arm-none-eabi-gcc 编译我的代码并使用QEMU 作为模拟器。在我尝试在send_no_wait 中调用safe_malloc 之前,一切正常。如果我在这里调用safe_malloc,函数send_no_wait 将返回错误的地址,程序将在几条汇编指令内崩溃。 safe_malloc 函数可以在其他地方工作,我的想法是内存可能以某种方式损坏,因为当我在send_no_wait 之前注释一些需要内存分配的函数时,send_no_wait 再次工作......
这是它分配的内存地址,以防safe_malloc 导致崩溃。
(gdb) p m
$5 = (msg *) 0x10501 <_vfiprintf_r+1796>
(gdb) p *m
$6 = {pData = 0x10519 <_vfiprintf_r+1820> "U", Status = 1, pBlock = 0x1b440,
pPrevious = 0xddef90, pNext = 0x2d0e92a} // pPrevious and pNext should point to 0x0
这是它在safe_malloc不会导致崩溃的情况下分配的内存地址(我注释了一些需要内存分配的函数)。
(gdb) p m
$1 = (msg *) 0x1b460
(gdb) p *m
$2 = {pData = 0x1b478 "U", Status = 1, pBlock = 0x1b428, pPrevious = 0x0, pNext = 0x0}
<_vfiprintf_r+1796> 是什么意思?这里分配的这块内存有问题吗?
exception send_no_wait(mailbox *mBox, void *pData) {
volatile uint first_execution = TRUE;
SaveContext();
if (first_execution == TRUE) {
first_execution = FALSE;
if (mBox->nMessages > 0 &&
mBox->pHead->Status == RECEIVER) { // receiving task is waiting
...
} else {
msg *m = safe_malloc(sizeof(msg));
m->pData = safe_malloc(mBox->nDataSize);
memcpy(m->pData, pData, mBox->nDataSize); // copy data to the message
m->Status = SENDER;
listobj *node = list_get_head(ready_list);
m->pBlock = node;
node->pMessage = m;
mailbox_push_no_wait_msg(mBox, m);
// ASYNCHRONOUS, DON'T RESCHEDULE HERE
}
}
return OK;
}
void *safe_malloc(unsigned int size) {
void *mem = malloc(size);
mem_counter++;
return mem;
}
【问题讨论】:
-
也许问题不在于您认为的问题所在?
malloc自己有问题吗?你写了吗?还是您在其他地方写的越界导致这里出现问题? -
我在标准库中使用
malloc,是的,我正在尝试测试其余代码... -
这个函数看起来很可疑:
SaveContext();它是在做它的名字所暗示的吗?你弄乱了你的堆栈框架吗?何时调用send_no_wait?是在某些中断上下文中吗? -
volatile uint first_execution = TRUE;你的意思是volatile还是static? -
在使用前声明
safe_malloc()确保这不是一个小问题。
标签: c malloc dynamic-memory-allocation