久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3397|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

內(nèi)存泄露問(wèn)題的解決過(guò)程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113276 發(fā)表于 2016-4-10 20:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
測(cè)試中發(fā)現(xiàn)有內(nèi)存泄露的情況,通過(guò)增加內(nèi)存的信息通過(guò)TCP輸出的 2301端口debug后發(fā)現(xiàn)
  異常的如下
總內(nèi)存數(shù)(字節(jié)):6144
已用內(nèi)存(字節(jié)):5816
剩余內(nèi)存數(shù)(字節(jié)):328
使用標(biāo)示:1
正常的如下
總內(nèi)存數(shù)(字節(jié)):6144
已用內(nèi)存(字節(jié)):20
剩余內(nèi)存數(shù)(字節(jié)):6124
使用標(biāo)示:1
顯然memalloc使內(nèi)存溢出查找代碼因?yàn)槌薙MTP應(yīng)用程序使用malloc外其他不具有使用的情況。
所以肯定是SMTP出問(wèn)題
進(jìn)一步分析代碼為SMTP的smtp_send_mail()中
smtp_send_mail_alloced(struct smtp_session *s)
函數(shù)使用的
s = (struct smtp_session *)SMTP_STATE_MALLOC((mem_size_t)mem_len);
分配了一塊內(nèi)存沒(méi)有事正常的釋放。
這樣反復(fù)
幾次最終導(dǎo)致這塊應(yīng)用代碼不能正常返回一塊完整的 mem_le大小的內(nèi)存塊而一直保留了328字節(jié)的剩余內(nèi)存。
這最終導(dǎo)致了所有依賴(lài)mem的應(yīng)用程序全部獲取不到足夠的內(nèi)存塊。而出現(xiàn)的內(nèi)存溢出。
繼續(xù)分析 釋放的內(nèi)存句柄  (struct smtp_session *) s
發(fā)現(xiàn)幾處問(wèn)題

1)非正常中止        “風(fēng)險(xiǎn)”
   if (smtp_verify(s->to, s->to_len, 0) != ERR_OK) {
    return ERR_ARG;
  }
  if (smtp_verify(s->from, s->from_len, 0) != ERR_OK) {
    return ERR_ARG;
  }
  if (smtp_verify(s->subject, s->subject_len, 0) != ERR_OK) {
    return ERR_ARG;
  }
  由于沒(méi)有對(duì)  smtp_send_mail_alloced 函數(shù)進(jìn)行判斷所以如果此處返回會(huì)造成函數(shù)不能正常中止
  也就會(huì)導(dǎo)致 (struct smtp_session *) s        沒(méi)有機(jī)會(huì)釋放(因?yàn)樵诓徽V兄箷r(shí)是在后面處理的)
  但是考慮到源數(shù)據(jù)是固定的從片上flash中取得的,這種幾率幾乎沒(méi)有。但是存在風(fēng)險(xiǎn)。所以統(tǒng)一改為
  if (smtp_verify(s->to, s->to_len, 0) != ERR_OK) {
             err = ERR_ARG;
     goto leave;
  }
  if (smtp_verify(s->from, s->from_len, 0) != ERR_OK) {
             err = ERR_ARG;
     goto leave;
  }
  if (smtp_verify(s->subject, s->subject_len, 0) != ERR_OK) {
             err = ERR_ARG;
     goto leave;
  }

  2)、非正常TCP連接,主要原因。
  原來(lái)的函數(shù)為:
  if(tcp_bind(pcb, IP_ADDR_ANY, SMTP_PORT)!=ERR_OK)
        {
        return        ERR_USEl;
            
        }
  顯然還是同樣的會(huì)造成malloc 分配了但是沒(méi)有被調(diào)用,修改為
  if(tcp_bind(pcb, IP_ADDR_ANY,SMTP_PORT)!=ERR_OK)
  {
        err = ERR_USE;
    goto leave;                  
  }

   這樣          leave中就會(huì)自動(dòng)處理釋放掉這個(gè)非正常中止的而造成的內(nèi)存的溢出問(wèn)題。
   leave:
  smtp_free_struct(s);
  return err;

歸根結(jié)底是一個(gè)問(wèn)題。那就是必須保證malloc 和free 成對(duì)出現(xiàn)。
實(shí)際驗(yàn)證時(shí)發(fā)現(xiàn)就是tcp_bind的時(shí)反回了(在100K以上的壓力數(shù)據(jù)下)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 影视一区 | 毛片网在线观看 | 欧美精品一区二区三区蜜桃视频 | 日韩精品久久一区二区三区 | 国产农村妇女毛片精品久久麻豆 | 欧美日韩在线一区 | 99av成人精品国语自产拍 | 国精品一区 | 免费一级欧美在线观看视频 | 欧美久久久久久 | 99精品一区 | 国产一区二区三区在线看 | 亚洲精品视频免费观看 | 久久国产高清 | 国产精品久久久99 | 天堂av中文 | 伊人手机在线视频 | 亚洲一区中文字幕 | 亚洲国产一区二区三区 | 国产精品五区 | 日本五月婷婷 | 在线观看中文视频 | 一二三四在线视频观看社区 | 欧美精品综合在线 | 天天干天天操天天射 | 久久精品亚洲精品国产欧美kt∨ | 中文字幕在线播放第一页 | 欧美猛交| 国产精品综合久久 | 91精品久久久久久久久久入口 | 精品欧美一区免费观看α√ | 中文字幕在线免费 | 国产一区二区三区四区 | 国产精品免费一区二区三区四区 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 91在线网站 | 久久精品com| 午夜男人视频 | 成人在线精品视频 | 免费一区二区在线观看 | wwww.8888久久爱站网 |