日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT-Thread使用經(jīng)驗(yàn)分享:動(dòng)態(tài)申請(qǐng)的內(nèi)存未清零造成死機(jī)

冬至子 ? 來(lái)源:張世爭(zhēng) ? 作者:張世爭(zhēng) ? 2023-10-08 14:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

最近在開(kāi)發(fā)調(diào)試基于RT-Thread 的程序時(shí),遇到一個(gè)比較奇怪的死機(jī)問(wèn)題,后來(lái)經(jīng)過(guò)一步步排查,終于發(fā)現(xiàn)是動(dòng)態(tài)內(nèi)存申請(qǐng)的數(shù)據(jù)結(jié)構(gòu)沒(méi)有清零引發(fā)的死機(jī)。

排查方法

由于沒(méi)有單步調(diào)試的手段,就通過(guò) 打印調(diào)試LOG 與 #if 0 A_CODE #else B_CODE #endif 條件編譯的方式,通過(guò)注釋部分代碼等方法,快速縮小問(wèn)題的排查范圍。

最終逐步排查,定位在內(nèi)存資源釋放的函數(shù)部分 xxfree,也就是程序執(zhí)行完了,釋放動(dòng)態(tài)申請(qǐng)的內(nèi)存時(shí),觸發(fā)了死機(jī),注釋掉這部分代碼,不死機(jī)了,不過(guò)這樣會(huì)造成【內(nèi)存泄露】

通過(guò)查看代碼繼續(xù)排查,xxfree 函數(shù)設(shè)計(jì)的沒(méi)有問(wèn)題,所有指針都有判空操作,也就是只會(huì) free 非空的指針,但是這種必現(xiàn)的死機(jī),就幾段內(nèi)存 free 的代碼,排查應(yīng)該容易,所以增加了些LOG,并且把 free 時(shí)的指針地址也打印出來(lái),確認(rèn)是否 free 了不屬于自己的指針或者重復(fù) free 指針。

問(wèn)題定位

在 xxfree 函數(shù) 增加多行 LOG后,再次運(yùn)行死機(jī)后,我看了一下死機(jī)后的 LOG 信息,瞬間找到了方向,原來(lái) free 的指針不是NULL,而是 0xffffffff,怪不得會(huì)死機(jī)!

通過(guò)全局搜索這個(gè)指針成員,竟沒(méi)有發(fā)現(xiàn)賦值的地方,也就是沒(méi)有賦值,希望它為 NULL,而它實(shí)際上是 0xffffffff。

這個(gè)指針附屬于一個(gè)大的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體是通過(guò) malloc 方式動(dòng)態(tài)內(nèi)存申請(qǐng)的,但是沒(méi)有【清零】操作,并且后續(xù)的操作中,這個(gè)指針成員由于某種條件下,沒(méi)有代碼執(zhí)行到賦值,默認(rèn)【野指針】。并且這個(gè)板子動(dòng)態(tài)申請(qǐng)的內(nèi)存默認(rèn)不是0x00,而是 0xff,所以 free 了 非空的野指針觸發(fā)死機(jī)

解決方法:malloc 后的數(shù)據(jù)結(jié)構(gòu),增加 memset 清零操作,這樣保證指針成員默認(rèn)為 NULL,如果是野指針, 并且free 時(shí)不為 NULL,會(huì)造成釋放內(nèi)存操作異常,大概率觸發(fā)死機(jī)。

觸累與排雷

繼續(xù)排查驅(qū)動(dòng)里面,有幾處也是通過(guò)動(dòng)態(tài)內(nèi)存申請(qǐng) malloc 數(shù)據(jù)結(jié)構(gòu) 后,也沒(méi)有 memset 清零,并且里面有 鏈表成員,鏈表也沒(méi)有初始化,并且【僥幸成功】的掛上了 鏈表頭 head 上,沒(méi)有觸發(fā)死機(jī)。

由于 資源釋放這個(gè)操作一般都發(fā)生在【游戲結(jié)束】后,也就是代碼不運(yùn)行了,所以沒(méi)有特別的注意,即使鏈表的成員沒(méi)有清零操作,指針為野指針,也能 插入到 鏈表頭,但是當(dāng)多次這種操作后,就會(huì)觸發(fā)內(nèi)存異常,因?yàn)闆](méi)有【清零】的內(nèi)存空間,數(shù)據(jù)可能不是零,在地雷的旁邊走,就有踩上去的機(jī)會(huì)!

加了 memset 清零操作后,果然觸發(fā)了幾個(gè)死機(jī),并且牽出來(lái) 【鏈表未初始化】 就直接使用的 BUG 操作。

有些操作可能運(yùn)行一次并未發(fā)生死機(jī)等【當(dāng)場(chǎng)就出現(xiàn)】的死機(jī)等錯(cuò)誤,但是多次運(yùn)行,錯(cuò)誤累積起來(lái),就會(huì)觸發(fā)更嚴(yán)重的錯(cuò)誤

代碼編寫(xiě)時(shí),規(guī)范化、充分測(cè)試非常有必要。

調(diào)試改善代碼的時(shí)間往往比編寫(xiě)代碼時(shí)間多很多,因此在代碼設(shè)計(jì)編寫(xiě)時(shí)要多花點(diǎn)心思與時(shí)間,充分驗(yàn)證,減少后續(xù)問(wèn)題的排查調(diào)試時(shí)間,提高工作效率。

1.jpg

小結(jié)

復(fù)雜點(diǎn)的數(shù)據(jù)結(jié)構(gòu),使用 動(dòng)態(tài)內(nèi)存申請(qǐng)后,建議直接 清零操作,以免默認(rèn)的數(shù)據(jù)不是自己想要的,造成程序運(yùn)行異常或者死機(jī),簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),如果能保證后面的操作把每個(gè)成員都賦值上,可以不清零。

初始化、清零,這些簡(jiǎn)單的操作,也需要重視起來(lái),以免耗費(fèi)大量的軟件排查與調(diào)試時(shí)間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 動(dòng)態(tài)內(nèi)存

    關(guān)注

    1

    文章

    25

    瀏覽量

    8259
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1644

    瀏覽量

    45268
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread內(nèi)核簡(jiǎn)介

    STM32 程序的內(nèi)存分布6、RT-Thread 自動(dòng)初始化機(jī)制8、RT-Thread 內(nèi)核對(duì)象模型靜態(tài)對(duì)象和動(dòng)態(tài)對(duì)
    發(fā)表于 08-06 07:44

    RT-Thread系統(tǒng)動(dòng)態(tài)內(nèi)存堆有哪幾種管理算法呢

    內(nèi)存塊。需要注意的是,在使用完動(dòng)態(tài)內(nèi)存之后,應(yīng)該將其釋放掉。否則,會(huì)出現(xiàn)內(nèi)存泄漏的問(wèn)題。1. 分配和釋放內(nèi)存RT-Thread 系統(tǒng)提供的
    發(fā)表于 03-31 13:53

    關(guān)于RT-Thread內(nèi)存管理的內(nèi)存池簡(jiǎn)析

    ,即當(dāng)內(nèi)存池中無(wú)可用內(nèi)存塊時(shí),其申請(qǐng)線(xiàn)程允許等待,申請(qǐng)線(xiàn)程將掛起在 suspend_thread 鏈表上。
    發(fā)表于 04-06 17:02

    關(guān)于RT-Thread動(dòng)態(tài)內(nèi)存堆管理簡(jiǎn)析

    內(nèi)存堆管理操作有以下幾種:初始化、申請(qǐng)內(nèi)存塊、釋放內(nèi)存塊。需要注意的是,在使用完動(dòng)態(tài)內(nèi)存之后,應(yīng)該將其釋放掉。否則,會(huì)出現(xiàn)
    發(fā)表于 04-06 17:11

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開(kāi)發(fā)組(2015-03-31)。RT-Thread做為國(guó)內(nèi)有較大影響力的開(kāi)源實(shí)時(shí)操作系統(tǒng),本文是RT-Thread實(shí)時(shí)操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    基于STM32F4和RT-Thread通用BootLoader使用經(jīng)驗(yàn)

    基于STM32F4、RT-Thread通用BootLoader使用經(jīng)驗(yàn)
    的頭像 發(fā)表于 02-27 17:23 ?8065次閱讀
    基于STM32F4和<b class='flag-5'>RT-Thread</b>通用BootLoader使用<b class='flag-5'>經(jīng)驗(yàn)</b>

    2022 RT-Thread全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)RT-Thread的支持

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread在攝像頭及IoT設(shè)備上的實(shí)踐經(jīng)驗(yàn)分享
    的頭像 發(fā)表于 05-27 11:08 ?2042次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

    RT-Thread 簡(jiǎn)介 作為一名 RTOS 的初學(xué)者,也許你對(duì) RT-Thread 還比較陌生。然而,隨著你的深入接觸,你會(huì)逐漸發(fā)現(xiàn) RT-Thread 的魅力和它相較于其他同類(lèi)型 RTOS
    的頭像 發(fā)表于 07-09 11:27 ?6243次閱讀
    <b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述

    RT-Thread學(xué)習(xí)筆記】用memwatch排除內(nèi)存泄露

    RT-Thread學(xué)習(xí)筆記】使用memwatch排除內(nèi)存泄露
    的頭像 發(fā)表于 07-30 14:01 ?3871次閱讀
    【<b class='flag-5'>RT-Thread</b>學(xué)習(xí)筆記】用memwatch排除<b class='flag-5'>內(nèi)存</b>泄露

    RT-Thread文檔_RT-Thread 簡(jiǎn)介

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

    RT-Thread文檔_內(nèi)存管理

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

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

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

    基于RT-Thread Studio學(xué)習(xí)

    前期準(zhǔn)備:從官網(wǎng)下載 RT-Thread Studio,弄個(gè)賬號(hào)登陸,開(kāi)啟rt-thread學(xué)習(xí)之旅。
    的頭像 發(fā)表于 05-15 11:00 ?6657次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學(xué)習(xí)

    RT-Thread 學(xué)習(xí)筆記:memheap 死機(jī)問(wèn)題的分析與解決

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

    RT-Thread使用經(jīng)驗(yàn)分享:鏈表初始化造成死機(jī)

    最近在開(kāi)發(fā)調(diào)試基于RT-Thread 的驅(qū)動(dòng)時(shí),遇到一個(gè)比較奇怪的死機(jī)問(wèn)題,后來(lái)經(jīng)過(guò)一步步排查,終于發(fā)現(xiàn)是驅(qū)動(dòng)的鏈表節(jié)點(diǎn)沒(méi)有初始化造成死機(jī)
    的頭像 發(fā)表于 10-08 14:49 ?2450次閱讀
    <b class='flag-5'>RT-Thread</b>使用<b class='flag-5'>經(jīng)驗(yàn)</b>分享:鏈表<b class='flag-5'>未</b>初始化<b class='flag-5'>造成</b><b class='flag-5'>死機(jī)</b>
    静海县| 嘉义市| 师宗县| 平昌县| 上林县| 彩票| 长治县| 新泰市| 黑河市| 江城| 山西省| 冀州市| 邻水| 定安县| 郓城县| 洛隆县| 右玉县| 鹤山市| 广河县| 永春县| 永昌县| 睢宁县| 年辖:市辖区| 新闻| 吐鲁番市| 崇义县| 沁阳市| 荔波县| 静宁县| 玉屏| 芮城县| 阿尔山市| 安义县| 沈阳市| 呼伦贝尔市| 习水县| 梨树县| 襄樊市| 德令哈市| 逊克县| 吉首市|