在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

前言
最近在開發調試基于RT-Thread 的驅動時,遇到一個比較奇怪的死機問題,后來經過一步步排查,終于發現是驅動的鏈表節點沒有初始化造成的死機

問題分析
RT-Thread 的驅動開發完成后,通過編寫串口 shell 測試命令,運行命令后,觸發死機

由于當前缺少單步的調試方法,只能通過增加LOG與打開關閉部分軟件功能,一步步縮小范圍

在函數調用的入口,把某些關鍵的函數調用分別注釋掉驗證,這樣逐步驗證下來,最終縮小到一個函數,調用這個函數就觸發死機。

用到的軟件調試方法
(1)增加LOG,確認代碼能執行到哪些函數,能執行到哪些行

(2)通過 #if 0 A_CODE #else B_CODE #endif 條件編譯的調試方法,大塊注釋部分代碼,確認代碼執行的路徑,縮小排查方向,確認是執行到哪個函數或模塊造成死機的

(3)通過對比代碼來確認問題,比如軟件正常工作過,后來改動死機了,大概率說明是改動造成的,所以可以通過 git BCompare.exe 等代碼管理與比對工具,代碼回溯,兩份新舊代碼對比分析,逐步把排查范圍縮小,從代碼層面分析可能造成死機的原因

問題分析
軟件調試有時候比較的簡單,有時候會比較的復雜,由于這個驅動移植來自其他系統的,數據結構里面的成員比較的多,所以初步通過代碼對比工具如 BCompare 進行代碼對比,發現了一點端倪:由于RT-Thread 暫時不支持 hash list(哈希鏈表),我把 hash list的功能實現 改為了 RT-Thread 的 list 替代,struct rt_list_node。

對比了軟件的其他改動點,雖然改動部分較大,但軟件工作流程差不多,初步排查代碼沒有實質性的差異

通過進一步的排查并縮小范圍,終于發現了問題點:這個函數在 插入鏈表 的操作部分死機了!

通過代碼繼續網上找,發現這個包含 RT-Thread list 的數據節點,是通過 rt_malloc 申請的,并且沒有看到成員 list 使用 rt_list_init 初始化鏈表的操作

所以馬上確認了問題: 鏈表的節點沒有初始化造成的,通過增加 list 初始化,本以為立即解決了問題,但是竟然依舊死機!

意外的BUG發現:數據節點的鏈表的頭,也就是 鏈表 head 也沒有初始化,解決方法同上,需要初始化 鏈表的頭:使用 rt_list_init,這樣問題得到解決

移植的代碼之前使用的 hashlist,聲明時即初始化了,不需要顯示的初始化,而RT-Thread list,必須初始化,否則把鏈表節點插入 鏈表頭部的時候,就會出現 野指針或空指針 訪問成員的問題,肯定會出問題。

1.jpg

解決方法就是 增加鏈表初始化操作

1.jpg

問題回顧
由于先前移植的樣板驅動使用的是 hash list,造成移植后沒有初始化數據結構的鏈表節點,觸發了死機。所以驅動移植時,遇到鏈表時,一定要注意 鏈表頭與鏈表節點的 鏈表初始化問題

另一個注意點:操作空指針的成員,異常信息里面,可能會提示 異常出在一個 較小的 內存地址上。所以遇到死機,并且發現死機的 內存地址很小,可以往 空指針方向排查

RT-Thread 雙向循環鏈表的操作,由于使用的是【宏定義】,也就是鏈表操作函數本身沒有判空的操作,用戶需要有鏈表指針判空的操作。

訪問一個空指針的結構體成員,肯定會觸發內存異常死機。 如 buffer->list 中的 list 為 RT_NULL,那么訪問 buffer->list->next 時候,list 中的 next 成員地址就是非法的內存地址(小地址),就會出現異常死機

小結
鏈表操作需要謹慎,不只是要把 鏈表頭 申請為 全局的,而且每個鏈表的節點,都是需要全局的。

注意鏈表節點會嵌入到一個復雜的數據結構里面,并且使用動態內存申請的方式 創建,這是一定要注意不要漏下 鏈表成員的初始化。

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

    關注

    52

    文章

    8241

    瀏覽量

    146399
  • Shell
    +關注

    關注

    1

    文章

    365

    瀏覽量

    23384
  • RT-Thread
    +關注

    關注

    31

    文章

    1290

    瀏覽量

    40153
收藏 人收藏

    評論

    相關推薦

    RT-Thread自動初始化詳解

    我們知道,在寫裸機程序時,當我們完成硬件初始化后,就需要在主函數中進行調用。當我們使用RT-Thread后,完全不需要這樣做了,我們可以將硬件等自動初始化。 RT-Thread?自動
    的頭像 發表于 06-25 21:38 ?1.1w次閱讀
    <b class='flag-5'>RT-Thread</b>自動<b class='flag-5'>初始化</b>詳解

    RT-Thread內核對象初始化鏈表組織方式

    最近在看RT-Thread內核的源碼,內核對象使用鏈表組織。
    發表于 06-02 09:48 ?760次閱讀
    <b class='flag-5'>RT-Thread</b>內核對象<b class='flag-5'>初始化</b><b class='flag-5'>鏈表</b>組織方式

    RT-Thread qemu mps2-an385 bsp移植制作 :系統運行篇

    前面已經讓 RT-Thread 進入了 entry 入口函數,并且 調整 鏈接腳本,自動初始化與 MSH shell 的符號已經預留, 進入了 RT-Thread初始化
    的頭像 發表于 11-14 12:27 ?849次閱讀
    <b class='flag-5'>RT-Thread</b> qemu mps2-an385 bsp移植制作 :系統運行篇

    RT-Thread 踩坑記錄 - 初始化線程時使用局部變量

    前言為了不再CTRL+C,CTRL+V,修改,我開始嘗試手敲代碼。RT-Thread線程可以靜態初始化,也可以動態申請內存的方式創建靜態初始化線程靜態初始化線程時,線程結構體與線程的棧
    發表于 05-13 18:40

    RT-thread初始化過程是怎樣進行的

    RT-thread初始化過程是怎樣進行的?擴展補丁Sub和super的作用是什么?如何去使用它們呢?
    發表于 11-29 07:42

    如何對RT-Thread系統進行初始化

    RT-Thread是如何啟動的?如何對RT-Thread系統進行初始化呢?
    發表于 11-30 07:54

    RT-Thread內核學習資料匯總

    操作方法在內核文件 object.c 中實現4、RT-Thread內核對象初始化鏈表介紹  鏈表是一種數據結構,跟其他的結構體類似,初始化
    發表于 03-15 10:45

    RT-Thread自動初始化機制簡介

    RT-Thread 的時鐘管理以時鐘節拍為基礎,時鐘節拍是 RT-Thread 操作系統中最小的RT-Thread 自動初始化機制時鐘單位。RT-T
    發表于 04-06 18:08

    淺析RT-Thread中對象容器與雙鏈表的操作

    _Object_Info_Unknown] ={ /* 初始化對象容器 - 線程 */ {RT_Object_Class_Thread,_OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread
    發表于 05-18 14:23

    一文詳解RT-Thread自動初始化

    在學RT-Thread時,經常能聽到這個詞:自動初始化。用起來也非常容易,一個宏就解決了,但是原理是什么呢?
    的頭像 發表于 07-21 10:17 ?7615次閱讀
    一文詳解<b class='flag-5'>RT-Thread</b>自動<b class='flag-5'>初始化</b>

    RT-Thread 內核學習筆記 - 內核對象初始化鏈表組織方式

    RT-Thread 內核學習筆記 - 內核對象rt_objectRT-Thread 內核學習筆記 - 內核對象管理RT-Thread 內核學習筆記 - 內核對象操作APIRT-Threa...
    發表于 01-25 18:24 ?3次下載
    <b class='flag-5'>RT-Thread</b> 內核學習筆記 - 內核對象<b class='flag-5'>初始化</b><b class='flag-5'>鏈表</b>組織方式

    RT-Thread全球技術大會:如何使用組件以及自動初始化流程

    RT-Thread全球技術大會:如何使用組件和自動初始化流程 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 15:16 ?945次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:如何使用組件以及自動<b class='flag-5'>初始化</b>流程

    RT-Thread自動初始化機制

    ??在分析之前首先查閱 RT-Thread 的官方文檔 [RT-Thread 自動初始化機制](https://www.rt-thread.org/document/site
    的頭像 發表于 06-17 08:52 ?2660次閱讀
    <b class='flag-5'>RT-Thread</b>自動<b class='flag-5'>初始化</b>機制

    rt-thread線程棧初始化參數分析

    RT-Thread 在線程初始化的代碼內有一段初始化線程堆棧的代碼
    的頭像 發表于 08-14 16:50 ?1757次閱讀
    <b class='flag-5'>rt-thread</b>線程棧<b class='flag-5'>初始化</b>參數分析

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

    最近在開發調試基于RT-Thread 的程序時,遇到一個比較奇怪的死機問題,后來經過一步步排查,終于發現是動態內存申請的數據結構沒有清零引發的死機
    的頭像 發表于 10-08 14:59 ?1050次閱讀
    <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>
    主站蜘蛛池模板: 美女视频黄.免费网址| 久久久综合色| 亚洲你xx我xx网站| 黄视频在线观看网站| 日美一级毛片| 女上男下边吃奶边做视频成都| 亚洲欧美成人| 激情久久婷婷| 亚洲成人777| 色中文字幕在线| 日韩欧美一区二区三区不卡视频 | 精品国产一区二区三区成人| 国产真实灌醉美女疯狂弄| 91久久天天躁狠狠躁夜夜| 欧美人与zoxxxx| 亚洲1卡二卡3卡四卡不卡| 国产在播放一区| 五月激情婷婷综合| 日本色黄| 久久一级毛片| 丁香婷婷综合五月综合色啪| 夜夜狠操| 久久精品看片| 13日本xxxxxxxxx18| 中文字幕第11页| 天天摸日日舔| 男人都懂的网址在线看片| 黄视频福利| 小雪被老外黑人撑破了视频| 久久影视免费观看网址| 久久伊人草| 一色屋免费视频| 日韩一级在线观看| 狠狠色丁香六月色| 午夜噜噜噜私人影院在线播放| 国内精品网站| 亚洲 欧美 91| 色综合天天综合网国产人| 精品国产成人系列| 天天摸天天操天天射| 视频网站黄|