精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RT-Thread使用經驗分享:動態申請的內存未清零造成死機

冬至子 ? 來源:張世爭 ? 作者:張世爭 ? 2023-10-08 14:59 ? 次閱讀

前言

最近在開發調試基于RT-Thread 的程序時,遇到一個比較奇怪的死機問題,后來經過一步步排查,終于發現是動態內存申請的數據結構沒有清零引發的死機。

排查方法

由于沒有單步調試的手段,就通過 打印調試LOG 與 #if 0 A_CODE #else B_CODE #endif 條件編譯的方式,通過注釋部分代碼等方法,快速縮小問題的排查范圍。

最終逐步排查,定位在內存資源釋放的函數部分 xxfree,也就是程序執行完了,釋放動態申請的內存時,觸發了死機,注釋掉這部分代碼,不死機了,不過這樣會造成【內存泄露】

通過查看代碼繼續排查,xxfree 函數設計的沒有問題,所有指針都有判空操作,也就是只會 free 非空的指針,但是這種必現的死機,就幾段內存 free 的代碼,排查應該容易,所以增加了些LOG,并且把 free 時的指針地址也打印出來,確認是否 free 了不屬于自己的指針或者重復 free 指針。

問題定位

在 xxfree 函數 增加多行 LOG后,再次運行死機后,我看了一下死機后的 LOG 信息,瞬間找到了方向,原來 free 的指針不是NULL,而是 0xffffffff,怪不得會死機!

通過全局搜索這個指針成員,竟沒有發現賦值的地方,也就是沒有賦值,希望它為 NULL,而它實際上是 0xffffffff。

這個指針附屬于一個大的結構體,這個結構體是通過 malloc 方式動態內存申請的,但是沒有【清零】操作,并且后續的操作中,這個指針成員由于某種條件下,沒有代碼執行到賦值,默認【野指針】。并且這個板子動態申請的內存默認不是0x00,而是 0xff,所以 free 了 非空的野指針觸發死機

解決方法:malloc 后的數據結構,增加 memset 清零操作,這樣保證指針成員默認為 NULL,如果是野指針, 并且free 時不為 NULL,會造成釋放內存操作異常,大概率觸發死機。

觸累與排雷

繼續排查驅動里面,有幾處也是通過動態內存申請 malloc 數據結構 后,也沒有 memset 清零,并且里面有 鏈表成員,鏈表也沒有初始化,并且【僥幸成功】的掛上了 鏈表頭 head 上,沒有觸發死機。

由于 資源釋放這個操作一般都發生在【游戲結束】后,也就是代碼不運行了,所以沒有特別的注意,即使鏈表的成員沒有清零操作,指針為野指針,也能 插入到 鏈表頭,但是當多次這種操作后,就會觸發內存異常,因為沒有【清零】的內存空間,數據可能不是零,在地雷的旁邊走,就有踩上去的機會!

加了 memset 清零操作后,果然觸發了幾個死機,并且牽出來 【鏈表未初始化】 就直接使用的 BUG 操作。

有些操作可能運行一次并未發生死機等【當場就出現】的死機等錯誤,但是多次運行,錯誤累積起來,就會觸發更嚴重的錯誤

代碼編寫時,規范化、充分測試非常有必要。

調試改善代碼的時間往往比編寫代碼時間多很多,因此在代碼設計編寫時要多花點心思與時間,充分驗證,減少后續問題的排查調試時間,提高工作效率。

1.jpg

小結

復雜點的數據結構,使用 動態內存申請后,建議直接 清零操作,以免默認的數據不是自己想要的,造成程序運行異常或者死機,簡單的數據結構,如果能保證后面的操作把每個成員都賦值上,可以不清零。

初始化、清零,這些簡單的操作,也需要重視起來,以免耗費大量的軟件排查與調試時間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 動態內存
    +關注

    關注

    1

    文章

    24

    瀏覽量

    7961
  • RT-Thread
    +關注

    關注

    31

    文章

    1273

    瀏覽量

    39924
收藏 人收藏

    評論

    相關推薦

    RT-Thread系統動態內存堆有哪幾種管理算法呢

    內存塊。需要注意的是,在使用完動態內存之后,應該將其釋放掉。否則,會出現內存泄漏的問題。1. 分配和釋放內存RT-Thread 系統提供的
    發表于 03-31 13:53

    關于RT-Thread內存管理的內存池簡析

    ,即當內存池中無可用內存塊時,其申請線程允許等待,申請線程將掛起在 suspend_thread 鏈表上。
    發表于 04-06 17:02

    關于RT-Thread動態內存堆管理簡析

    內存堆管理操作有以下幾種:初始化、申請內存塊、釋放內存塊。需要注意的是,在使用完動態內存之后,應該將其釋放掉。否則,會出現
    發表于 04-06 17:11

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT-Thread實時操作系統的編程指南
    發表于 11-26 16:06 ?0次下載

    基于STM32F4和RT-Thread通用BootLoader使用經驗

    基于STM32F4、RT-Thread通用BootLoader使用經驗
    的頭像 發表于 02-27 17:23 ?6197次閱讀
    基于STM32F4和<b class='flag-5'>RT-Thread</b>通用BootLoader使用<b class='flag-5'>經驗</b>

    2022 RT-Thread全球技術大會:螢石EZIOT SDK對RT-Thread的支持

    2022 RT-Thread全球技術大會:RT-Thread在攝像頭及IoT設備上的實踐經驗分享
    的頭像 發表于 05-27 11:08 ?1291次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術大會:螢石EZIOT SDK對<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread學習筆記 RT-Thread的架構概述

    RT-Thread 簡介 作為一名 RTOS 的初學者,也許你對 RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會逐漸發現 RT-Thread 的魅力和它相較于其他同類型 RTOS
    的頭像 發表于 07-09 11:27 ?4485次閱讀
    <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

    RT-Thread學習筆記】用memwatch排除內存泄露

    RT-Thread學習筆記】使用memwatch排除內存泄露
    的頭像 發表于 07-30 14:01 ?2240次閱讀
    【<b class='flag-5'>RT-Thread</b>學習筆記】用memwatch排除<b class='flag-5'>內存</b>泄露

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_內存管理

    RT-Thread文檔_內存管理
    發表于 02-22 18:30 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>內存</b>管理

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?3829次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習

    RT-Thread 學習筆記:memheap 死機問題的分析與解決

    5.0.1 版本(2023-05-28 master 主線) bsp : bspstm32stm32l476-st-nucleo 功能描述 最近在研究 RT-Thread 內存的管理,熟悉了一下
    的頭像 發表于 05-29 18:05 ?1749次閱讀
    <b class='flag-5'>RT-Thread</b> 學習筆記:memheap <b class='flag-5'>死機</b>問題的分析與解決

    RT-Thread使用經驗分享:鏈表初始化造成死機

    最近在開發調試基于RT-Thread 的驅動時,遇到一個比較奇怪的死機問題,后來經過一步步排查,終于發現是驅動的鏈表節點沒有初始化造成死機
    的頭像 發表于 10-08 14:49 ?887次閱讀
    <b class='flag-5'>RT-Thread</b>使用<b class='flag-5'>經驗</b>分享:鏈表<b class='flag-5'>未</b>初始化<b class='flag-5'>造成</b><b class='flag-5'>死機</b>