【问题标题】:malloc gives weird allocation memory addressmalloc 给出了奇怪的分配内存地址
【发布时间】: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}

&lt;_vfiprintf_r+1796&gt; 是什么意思?这里分配的这块内存有问题吗?

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


【解决方案1】:

我认为您的主要问题在于memcpy(m-&gt;pData, pData, mBox-&gt;nDataSize);,因为它遵循shallow copy 概念。尝试用deep copy 概念替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2016-03-02
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多