chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

告別 “棧溢出”!用 RT-Trace 工具精準(zhǔn)定位嵌入式系統(tǒng)內(nèi)存隱患 | 技術(shù)集結(jié)

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

掃碼添加小助手

加入工程師交流群

前言


相信無論大佬還是小白,都在開發(fā)中遇到過棧溢出的問題,而且因?yàn)闆]有明確日志,難以定位問題的根源。Stack Overflow 社區(qū)的命名也由此而生,而到現(xiàn)在雖然Stack Overflow因?yàn)榇竽P鸵呀?jīng)幾乎要涼涼了,但是棧溢出的問題仍然困擾著許多開發(fā)者

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

測試環(huán)境


星火一號開發(fā)板

rt-trace工具

使用方法和效果


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

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

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

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

#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 // 默認(rèn)最大遞歸次數(shù)staticintmax_recursion = MAX_RECURSION_DEFAULT;// 可控制的最大遞歸次數(shù)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);}/*** 遞歸棧溢出測試函數(shù)* 每次遞歸僅創(chuàng)建一個(gè)32位變量* @param depth 當(dāng)前遞歸深度*/voidrecursive_stack_overflow(intdepth){ volatileuint32_ta =0x12345678;// 創(chuàng)建一個(gè)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); } // 終止條件:達(dá)到最大遞歸次數(shù) if(depth >= max_recursion) { rt_kprintf("[Depth:%2d] 已達(dá)到最大遞歸次數(shù) %d,終止遞歸\n", depth, max_recursion); return; } last_a_addr = (void*)&a; // 短暫延遲,便于觀察輸出 rt_thread_mdelay(10); // 遞歸調(diào)用 recursive_stack_overflow(depth +1);}/*** 棧保護(hù)線程入口函數(shù)* @param p 線程參數(shù)*/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; // 打印線程啟動(dòng)信息 rt_kprintf("線程啟動(dòng):\n"); rt_kprintf(" 棧底地址: 0x%08X\n", stack_bottom_addr); rt_kprintf(" 棧頂?shù)刂? 0x%08X\n", stack_top_addr); rt_kprintf(" 棧大小: %d 字節(jié)\n", stack_size); rt_kprintf(" 最大遞歸次數(shù): %d\n", max_recursion); rt_kprintf("----------------------------------------\n"); rt_thread_mdelay(20); // 開始遞歸測試 recursive_stack_overflow(1); rt_kprintf("----------------------------------------\n"); rt_kprintf("遞歸測試結(jié)束\n");}/*** 設(shè)置最大遞歸次數(shù)(外部可調(diào)用)* @param count 最大遞歸次數(shù),<=0 則使用默認(rèn)值?*/void?set_max_recursion(int?argc,?char?**argv){? ? int?count =?atoi(argv[1]);? ? if?(count <=?0)? ? {? ? ? ? max_recursion = MAX_RECURSION_DEFAULT;? ? ? ? rt_kprintf("已設(shè)置最大遞歸次數(shù)為默認(rèn)值: %d\n", MAX_RECURSION_DEFAULT);? ? }? ? else? ? {? ? ? ? max_recursion = count;? ? ? ? rt_kprintf("已設(shè)置最大遞歸次數(shù)為: %d\n", max_recursion);? ? }}MSH_CMD_EXPORT(set_max_recursion, 設(shè)置最大遞歸次數(shù)(參數(shù)為次數(shù)));/**?* 創(chuàng)建棧保護(hù)測試線程?*/void?create_stack_protect_thread(void){? ? // 創(chuàng)建線程(棧大小2048字節(jié))? ? stack_thread =?rt_thread_create(? ? ? ? "stack_thread", ? ? ? // 線程名稱? ? ? ? stack_protect_thread,?// 入口函數(shù)? ? ? ? RT_NULL, ? ? ? ? ? ? ?// 參數(shù)? ? ? ? 512, ? ? ? ? ? ? ? ? ?// 棧大小? ? ? ? 20, ? ? ? ? ? ? ? ? ? // 優(yōu)先級? ? ? ? 10? ? ? ? ? ? ? ? ? ? // 時(shí)間片? ? );? ? if?(stack_thread != RT_NULL)? ? {? ? ? ? rt_thread_startup(stack_thread);? ? ? ? rt_kprintf("棧保護(hù)線程創(chuàng)建成功\n");? ? }? ? else? ? {? ? ? ? rt_kprintf("棧保護(hù)線程創(chuàng)建失敗\n");? ? }}MSH_CMD_EXPORT(create_stack_protect_thread, 創(chuàng)建棧保護(hù)測試線程);

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

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

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

8-12s 遞歸八次時(shí),在第6次踩到我們的64字節(jié)報(bào)警線

msh />create_stack_protect_thread棧保護(hù)線程創(chuàng)建成功msh />線程啟動(dòng): 棧底地址:0x20004160 棧頂?shù)刂?0x20004360 棧大小: 512字節(jié) 最大遞歸次數(shù):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

從上面的調(diào)試日志可以看到,棧溢出前64字節(jié),正好是第六次遞歸的時(shí)候,這說明這個(gè)棧溢出報(bào)警起碼準(zhǔn)確度沒問題。

但是細(xì)心的小伙伴可能發(fā)現(xiàn)了另一個(gè)問題,距離棧底似乎還有很大的空間,但是棧溢出“提前發(fā)生了”,我們的報(bào)警也提前了。這是因?yàn)槲覀兊倪f歸函數(shù)中調(diào)用了其他的函數(shù),經(jīng)過調(diào)試發(fā)現(xiàn),造成棧溢出的直接原因是rt_thread_mdelay,最后棧溢出時(shí),第八次遞歸進(jìn)入后,sp位置在0x20004240,而調(diào)用rt_thread_mdelay最大深度能到0x2000412c,此時(shí)已經(jīng)遠(yuǎn)遠(yuǎn)超過了我們的棧底,所以溢出和警報(bào)都是正常的。

總結(jié)


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

不過還是有些可以繼續(xù)提升的部分,比如現(xiàn)在的棧保護(hù)只能保護(hù)一個(gè)線程,如果能實(shí)時(shí)自動(dòng)保護(hù)所有的線程,可能使用的體驗(yàn)和帶來的幫助會更好。

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

    關(guān)注

    41

    文章

    3702

    瀏覽量

    132560
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3155

    瀏覽量

    75858
  • 堆棧溢出
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    嵌入式RTOS的 任務(wù)系統(tǒng)

    簡介明了帶你了解嵌入式RTOS的 任務(wù)系統(tǒng)
    的頭像 發(fā)表于 05-16 09:57 ?4498次閱讀
    <b class='flag-5'>嵌入式</b>RTOS的 任務(wù)<b class='flag-5'>棧</b> 和 <b class='flag-5'>系統(tǒng)</b><b class='flag-5'>棧</b>

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

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

    揭秘!基于RT-Thread探究“優(yōu)先級反轉(zhuǎn)”下的任務(wù)調(diào)度究竟是什么樣的?| 技術(shù)集結(jié)

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

    基于“互聯(lián)網(wǎng)+”與北斗的精準(zhǔn)定位智慧停車系統(tǒng)

    停車系統(tǒng)進(jìn)行集中管理,相信應(yīng)該會好很多。精準(zhǔn)定位智慧停車系統(tǒng)目前,太原市已經(jīng)開始著手建設(shè)“互聯(lián)網(wǎng)+”與北斗精準(zhǔn)定位智慧停車系統(tǒng),結(jié)合車位傳感
    發(fā)表于 08-08 17:07

    如何使用嵌入式內(nèi)存分配管理技術(shù)

    嵌入式---內(nèi)存分配管理嵌入式內(nèi)存一般都非常的小,最進(jìn)在學(xué)習(xí)LWIP協(xié)議的移植,在正點(diǎn)原子的學(xué)習(xí)資料中找到了許多關(guān)于怎么移植協(xié)議
    發(fā)表于 12-17 06:41

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

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

    trace32 for rt-thread support的基本使用及系統(tǒng)插件原理

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

    jvm內(nèi)存溢出該如何定位解決

    超出限制和堆空間不足。 定位JVM內(nèi)存溢出問題是一個(gè)比較復(fù)雜的任務(wù),需要結(jié)合工具技術(shù)來進(jìn)行分析和解決。本文將介紹一些常用的調(diào)試和解決
    的頭像 發(fā)表于 12-05 11:05 ?1838次閱讀

    頂堅(jiān)國產(chǎn)芯單北斗執(zhí)法儀:精準(zhǔn)定位鐵路隱患,保障行車安全

    頂堅(jiān)國產(chǎn)芯單北斗執(zhí)法儀,是一款集成了北斗衛(wèi)星導(dǎo)航系統(tǒng)和先進(jìn)技術(shù)的執(zhí)法設(shè)備,依托北斗衛(wèi)星導(dǎo)航系統(tǒng)的高精度定位技術(shù),
    的頭像 發(fā)表于 01-09 15:25 ?581次閱讀
    頂堅(jiān)國產(chǎn)芯單北斗執(zhí)法儀:<b class='flag-5'>精準(zhǔn)定位</b>鐵路<b class='flag-5'>隱患</b>,保障行車安全

    重磅預(yù)售!RT-Trace調(diào)試工具

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

    RT-Trace調(diào)試工具正式發(fā)布!

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

    RT-Trace初體驗(yàn)一之使用Trace功能調(diào)試Cortex-M4 | 技術(shù)集結(jié)

    隨著嵌入式系統(tǒng)規(guī)模和復(fù)雜度不斷提升,傳統(tǒng)的調(diào)試手段已難以滿足對系統(tǒng)運(yùn)行狀態(tài)的精細(xì)化分析需求。為提升開發(fā)效率、優(yōu)化系統(tǒng)性能,RT-Thread
    的頭像 發(fā)表于 07-06 10:03 ?909次閱讀
    <b class='flag-5'>RT-Trace</b>初體驗(yàn)一之使用<b class='flag-5'>Trace</b>功能調(diào)試Cortex-M4 | <b class='flag-5'>技術(shù)</b><b class='flag-5'>集結(jié)</b>

    【直播預(yù)告】RT-Trace調(diào)試工具V1.1.0版本功能全解析 | 問學(xué)直播

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

    【干貨分享】RT-Trace國產(chǎn)調(diào)試工具 | 技術(shù)集結(jié)

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

    【直播預(yù)告】RT-Trace 全新版本發(fā)布|ITM輸出 MemoryWatch 功能首發(fā)實(shí)測! | 問學(xué)直播

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