我正在使用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;
}
我认为您的主要问题在于memcpy(m->pData, pData, mBox->nDataSize);
,因为它遵循shallow copy
概念。尝试用deep copy
概念代替。