伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

3天內不再提示

告別 “棧溢出”!用 RT-Trace 工具精準定位嵌入式系統內存隱患 | 技術集結

RT-Thread官方賬號 ? 2025-08-31 09:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言


相信無論大佬還是小白,都在開發中遇到過棧溢出的問題,而且因為沒有明確日志,難以定位問題的根源。Stack Overflow 社區的命名也由此而生,而到現在雖然Stack Overflow因為大模型已經幾乎要涼涼了,但是棧溢出的問題仍然困擾著許多開發者。

正好RT-Trace發布了他們的內測新功能——棧保護,與此同時,采集時長也有了大幅提升,在我的板子上甚至可以穩定采集 三分鐘。那我們就來看看他的效果和實用性吧。

測試環境


星火一號開發板

rt-trace工具

使用方法和效果


90adc286-860a-11f0-9080-92fbcf53809c.png

可以看到使用方法順延了先前trace功能的配置界面,加上了兩個框,來選擇需要保護的線程和需要被保護的棧底空間大小,使用起來還是很簡單的

90bf1766-860a-11f0-9080-92fbcf53809c.png

配置成功后就可以去trace_view界面測試了,這里我星火一號上跑了一個遞歸爆棧測試程序,沒有優化

#include#include#include#ifndefRT_USING_NANO#include#include#include#include#endif/* RT_USING_NANO */rt_thread_tstack_thread =NULL;#defineTHREAD_PRIORITY 25#defineTHREAD_STACK_SIZE 512#defineTHREAD_TIMESLICE 5intmain(void){ while(1) { rt_thread_mdelay(500); }}#defineMAX_RECURSION_DEFAULT 5 // 默認最大遞歸次數staticintmax_recursion = MAX_RECURSION_DEFAULT;// 可控制的最大遞歸次數void*get_stack_top_addr(){ return(void*)((uint32_t)stack_thread->stack_addr + stack_thread->stack_size);}void*get_stack_bottom_addr(){ return(void*)((uint32_t)stack_thread->stack_addr);}/*** 遞歸棧溢出測試函數* 每次遞歸僅創建一個32位變量* @param depth 當前遞歸深度*/voidrecursive_stack_overflow(intdepth){ volatileuint32_ta =0x12345678;// 創建一個32位變量并賦值 staticvoid*last_a_addr =NULL; // 獲取棧邊界地址 void*stack_bottom_addr =get_stack_bottom_addr(); void*stack_top_addr =get_stack_top_addr(); if(depth !=1) { uint32_tstack_used = (uint32_t)last_a_addr - (uint32_t)&a; rt_kprintf("[Depth:%2d] var_a addr:0x%08X,stack_used: %d\n ", depth, &a, stack_used); } else { rt_kprintf("[Depth:%2d] var_a addr:0x%08X\n ", depth, &a); } // 終止條件:達到最大遞歸次數 if(depth >= max_recursion) { rt_kprintf("[Depth:%2d] 已達到最大遞歸次數 %d,終止遞歸\n", depth, max_recursion); return; } last_a_addr = (void*)&a; // 短暫延遲,便于觀察輸出 rt_thread_mdelay(10); // 遞歸調用 recursive_stack_overflow(depth +1);}/*** 棧保護線程入口函數* @param p 線程參數*/voidstack_protect_thread(void*p){ // 獲取棧信息 void*stack_bottom_addr =get_stack_bottom_addr(); void*stack_top_addr =get_stack_top_addr(); uint32_tstack_size = stack_thread->stack_size; // 打印線程啟動信息 rt_kprintf("線程啟動:\n"); rt_kprintf(" 棧底地址: 0x%08X\n", stack_bottom_addr); rt_kprintf(" 棧頂地址: 0x%08X\n", stack_top_addr); rt_kprintf(" 棧大小: %d 字節\n", stack_size); rt_kprintf(" 最大遞歸次數: %d\n", max_recursion); rt_kprintf("----------------------------------------\n"); rt_thread_mdelay(20); // 開始遞歸測試 recursive_stack_overflow(1); rt_kprintf("----------------------------------------\n"); rt_kprintf("遞歸測試結束\n");}/*** 設置最大遞歸次數(外部可調用)* @param count 最大遞歸次數,<=0 則使用默認值?*/void?set_max_recursion(int?argc,?char?**argv){? ? int?count =?atoi(argv[1]);? ? if?(count <=?0)? ? {? ? ? ? max_recursion = MAX_RECURSION_DEFAULT;? ? ? ? rt_kprintf("已設置最大遞歸次數為默認值: %d\n", MAX_RECURSION_DEFAULT);? ? }? ? else? ? {? ? ? ? max_recursion = count;? ? ? ? rt_kprintf("已設置最大遞歸次數為: %d\n", max_recursion);? ? }}MSH_CMD_EXPORT(set_max_recursion, 設置最大遞歸次數(參數為次數));/**?* 創建棧保護測試線程?*/void?create_stack_protect_thread(void){? ? // 創建線程(棧大小2048字節)? ? stack_thread =?rt_thread_create(? ? ? ? "stack_thread", ? ? ? // 線程名稱? ? ? ? stack_protect_thread,?// 入口函數? ? ? ? RT_NULL, ? ? ? ? ? ? ?// 參數? ? ? ? 512, ? ? ? ? ? ? ? ? ?// 棧大小? ? ? ? 20, ? ? ? ? ? ? ? ? ? // 優先級? ? ? ? 10? ? ? ? ? ? ? ? ? ? // 時間片? ? );? ? if?(stack_thread != RT_NULL)? ? {? ? ? ? rt_thread_startup(stack_thread);? ? ? ? rt_kprintf("棧保護線程創建成功\n");? ? }? ? else? ? {? ? ? ? rt_kprintf("棧保護線程創建失敗\n");? ? }}MSH_CMD_EXPORT(create_stack_protect_thread, 創建棧保護測試線程);

經過遞歸三次,五次,八次(第八次溢出)的測試后,捕獲到的trace圖像是這樣的

90d20b1e-860a-11f0-9080-92fbcf53809c.png90e0c55a-860a-11f0-9080-92fbcf53809c.png90e989ba-860a-11f0-9080-92fbcf53809c.png

0-4s 和 0-8s 遞歸三次以及遞歸五次,都沒有踩到我們的報警閾值

8-12s 遞歸八次時,在第6次踩到我們的64字節報警線

msh />create_stack_protect_thread棧保護線程創建成功msh />線程啟動: 棧底地址:0x20004160 棧頂地址:0x20004360 棧大小: 512字節 最大遞歸次數:10----------------------------------------[Depth: 1] var_a addr:0x20004330[Depth: 2] var_a addr:0x20004310,stack_used:32[Depth: 3] var_a addr:0x200042F0,stack_used:32[Depth: 4] var_a addr:0x200042D0,stack_used:32[Depth: 5] var_a addr:0x200042B0,stack_used:32[Depth: 6] var_a addr:0x20004290,stack_used:32[Depth: 7] var_a addr:0x20004270,stack_used:32[Depth: 8] var_a addr:0x20004250,stack_used:32[E/kernel.sched] thread:stack_tstack overflow

從上面的調試日志可以看到,棧溢出前64字節,正好是第六次遞歸的時候,這說明這個棧溢出報警起碼準確度沒問題。

但是細心的小伙伴可能發現了另一個問題,距離棧底似乎還有很大的空間,但是棧溢出“提前發生了”,我們的報警也提前了。這是因為我們的遞歸函數中調用了其他的函數,經過調試發現,造成棧溢出的直接原因是rt_thread_mdelay,最后棧溢出時,第八次遞歸進入后,sp位置在0x20004240,而調用rt_thread_mdelay最大深度能到0x2000412c,此時已經遠遠超過了我們的棧底,所以溢出和警報都是正常的。

總結


體驗下來,rt-trace的棧保護功能確實能很好的提示我線程棧的使用情況,可調的閾值也給了用戶比較大的自由度,這次的升級trace的采集時間也大大加長了,之前只能采12秒,現在可以以分鐘為單位進行采集。

不過還是有些可以繼續提升的部分,比如現在的棧保護只能保護一個線程,如果能實時自動保護所有的線程,可能使用的體驗和帶來的幫助會更好。

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

    關注

    41

    文章

    3808

    瀏覽量

    133822
  • 內存
    +關注

    關注

    9

    文章

    3224

    瀏覽量

    76472
  • 堆棧溢出
    +關注

    關注

    0

    文章

    10

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    嵌入式RTOS的 任務系統

    簡介明了帶你了解嵌入式RTOS的 任務系統
    的頭像 發表于 05-16 09:57 ?5328次閱讀
    <b class='flag-5'>嵌入式</b>RTOS的 任務<b class='flag-5'>棧</b> 和 <b class='flag-5'>系統</b><b class='flag-5'>棧</b>

    RT-Trace】功能再升級!GDB?Server功能?+?Flash一鍵燒錄,嵌入式開發更加便捷!|?技術集結

    RT-Trace持續進化,推出兩大開發者期待的核心功能:GDBServer功能與Flash程序燒錄!本次升級旨在為嵌入式開發者提供更強大、更便捷、更高效的開發調試體驗,顯著提升開發效率,降低門檻
    的頭像 發表于 07-25 15:40 ?4992次閱讀
    【<b class='flag-5'>RT-Trace</b>】功能再升級!GDB?Server功能?+?Flash一鍵燒錄,<b class='flag-5'>嵌入式</b>開發更加便捷!|?<b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    揭秘!基于RT-Thread探究“優先級反轉”下的任務調度究竟是什么樣的?| 技術集結

    本文將基于RT-Thread,結合RT-Trace調試器細化到實際任務調度的粒度,來調試并逐步講解“優先級反轉”的調度和運行邏輯。如果對RT-Trace感興趣的可以看這篇文章:國產嵌入式
    的頭像 發表于 08-17 10:07 ?3424次閱讀
    揭秘!基于<b class='flag-5'>RT</b>-Thread探究“優先級反轉”下的任務調度究竟是什么樣的?| <b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    RT-Thread Vector軟件包:嵌入式開發的動態數組容器 | 技術集結

    RT-Thread Vector軟件包:嵌入式開發的動態數組容器 | 技術集結
    的頭像 發表于 01-25 09:33 ?5566次閱讀
    <b class='flag-5'>RT</b>-Thread Vector軟件包:<b class='flag-5'>嵌入式</b>開發的動態數組容器 | <b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    如何使用嵌入式內存分配管理技術

    嵌入式---內存分配管理嵌入式內存一般都非常的小,最進在學習LWIP協議的移植,在正點原子的學習資料中找到了許多關于怎么移植協議
    發表于 12-17 06:41

    求一種嵌入式軟件中的溢出檢查方案

    嵌入式軟件中溢出產生的原因是什么?嵌入式軟件中的溢出是怎樣產生的呢?
    發表于 01-19 06:48

    trace32 for rt-thread support的基本使用及系統插件原理

    的生產商,自1979年以來,在制造世界一流的調試器和實時跟蹤方面擁有豐富經驗。其中產品線中的TRACE32為大眾廣為所知,是眾多手機廠商、芯片廠商的必備工具。 在嵌入式底層開發來說,不使用一下
    的頭像 發表于 01-07 10:34 ?8379次閱讀

    jvm內存溢出該如何定位解決

    超出限制和堆空間不足。 定位JVM內存溢出問題是一個比較復雜的任務,需要結合工具技術來進行分析和解決。本文將介紹一些常用的調試和解決
    的頭像 發表于 12-05 11:05 ?2211次閱讀

    頂堅國產芯單北斗執法儀:精準定位鐵路隱患,保障行車安全

    頂堅國產芯單北斗執法儀,是一款集成了北斗衛星導航系統和先進技術的執法設備,依托北斗衛星導航系統的高精度定位技術,
    的頭像 發表于 01-09 15:25 ?881次閱讀
    頂堅國產芯單北斗執法儀:<b class='flag-5'>精準定位</b>鐵路<b class='flag-5'>隱患</b>,保障行車安全

    重磅預售!RT-Trace調試工具

    嵌入式開發者注意!調試神器RT-Trace即將登陸淘寶!嵌入式開發從業者們:您是否常被調試效率低下、線程分析不清、故障定位困難所困擾?別愁!專為嵌入
    的頭像 發表于 05-20 18:15 ?1266次閱讀
    重磅預售!<b class='flag-5'>RT-Trace</b>調試<b class='flag-5'>工具</b>

    RT-Trace調試工具正式發布!

    嵌入式開發者打造的高性能調試工具。RT-Trace支持SWD/JTAG高速連接,搭載板載顯示屏離線交互系統與WebUI實時監控平臺,助力代碼調試、性能分析、故障排查全流程
    的頭像 發表于 06-18 12:02 ?1635次閱讀
    <b class='flag-5'>RT-Trace</b>調試<b class='flag-5'>工具</b>正式發布!

    RT-Trace初體驗一之使用Trace功能調試Cortex-M4 | 技術集結

    隨著嵌入式系統規模和復雜度不斷提升,傳統的調試手段已難以滿足對系統運行狀態的精細化分析需求。為提升開發效率、優化系統性能,RT-Thread
    的頭像 發表于 07-06 10:03 ?1648次閱讀
    <b class='flag-5'>RT-Trace</b>初體驗一之使用<b class='flag-5'>Trace</b>功能調試Cortex-M4 | <b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    【直播預告】RT-Trace調試工具V1.1.0版本功能全解析 | 問學直播

    RT-Thread一直致力于為開發者提供更高效的工具技術支持。RT-Trace調試工具自面世以來持續演進,功能不斷豐富:2025年5月:
    的頭像 發表于 09-05 11:53 ?1349次閱讀
    【直播預告】<b class='flag-5'>RT-Trace</b>調試<b class='flag-5'>工具</b>V1.1.0版本功能全解析 | 問學直播

    【干貨分享】RT-Trace國產調試工具 | 技術集結

    嵌入式系統開發中,調試一直是最具挑戰性的環節之一。傳統的調試方式往往依賴低速串口輸出、簡單的斷點調試或離線日志記錄,這些手段在面對復雜的實時系統時存在諸多局限。RT-Trace
    的頭像 發表于 09-16 08:07 ?1011次閱讀
    【干貨分享】<b class='flag-5'>RT-Trace</b>國產調試<b class='flag-5'>工具</b> | <b class='flag-5'>技術</b><b class='flag-5'>集結</b>

    【直播預告】RT-Trace 全新版本發布|ITM輸出 MemoryWatch 功能首發實測! | 問學直播

    RT-Trace迎來又一次重要更新!本次新版本帶來了兩項備受期待的功能——ITM輸出與MemoryWatch內存監控,讓調試可視化更高效、問題定位精準。為幫助開發者快速上手新特性
    的頭像 發表于 10-14 11:57 ?633次閱讀
    【直播預告】<b class='flag-5'>RT-Trace</b> 全新版本發布|ITM輸出  MemoryWatch 功能首發實測! | 問學直播