RT-Thread 使用经验分享 :链表未初始化造成死机
创始人
2025-05-30 05:49:29
0次

前言

  • 最近在开发调试基于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,必须初始化,否则把链表节点插入 链表头部的时候,就会出现 野指针或空指针 访问成员的问题,肯定会出问题。

2023-03-18_102302.png

  • 解决方法就是 增加链表初始化操作

2023-03-18_102440.png

问题回顾

  • 由于先前移植的样板驱动使用的是 hash list,造成移植后没有初始化数据结构的链表节点,触发了死机。所以驱动移植时,遇到链表时,一定要注意 链表头与链表节点的 链表初始化问题

  • 另一个注意点:操作空指针的成员,异常信息里面,可能会提示 异常出在一个 较小的 内存地址上。所以遇到死机,并且发现死机的 内存地址很小,可以往 空指针方向排查

  • RT-Thread 双向循环链表的操作,由于使用的是【宏定义】,也就是链表操作函数本身没有判空的操作,用户需要有链表指针判空的操作。

  • 访问一个空指针的结构体成员,肯定会触发内存异常死机。 如 buffer->list 中的 list 为 RT_NULL,那么访问 buffer->list->next 时候,list 中的 next 成员地址就是非法的内存地址(小地址),就会出现异常死机

小结

  • 链表操作需要谨慎,不只是要把 链表头 申请为 全局的,而且每个链表的节点,都是需要全局的。

  • 注意链表节点会嵌入到一个复杂的数据结构里面,并且使用动态内存申请的方式 创建,这是一定要注意不要漏下 链表成员的初始化。

相关内容

热门资讯

在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...
矅光智策APP平台违规经营非法...   矅光智策APP对外宣称是“商城订购”“现货交易”,但查询其经营范围,并未显示具备开展现货期货交易...
黄金珠宝怎么选?内侧刻字都代表... 潮新闻客户端 记者 马焱 通讯员 任倩影 9月8日下午,“云游杭州 乐购金秋”——“浙城·浙放心”活...
原创 冰... 最近全球国债市场正在上演魔幻一幕: 美债、日债、欧债遭遇猛烈抛售,收益率冲到几十年新高,美国财政部都...
日韩股市开盘表现分化 上证报中国证券网讯 9月9日,日韩股市开盘表现分化,韩国综合指数开盘上涨0.26%,报6972.87...