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 中的 listRT_NULL,那么访问 buffer->list->next 时候,list 中的 next 成员地址就是非法的内存地址(小地址),就会出现异常死机

小结

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

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

相关内容

热门资讯

阿联酋最大银行及另两家中东银行... 观点网讯:5月8日,路透社报道指,阿联酋最大银行第一阿布扎比银行(First Abu Dhabi B...
深圳239亿地王易主,再造万象... 2017年,世茂集团豪掷239.43亿元拿下世茂深港国际中心地块,曾规划建筑高度达700米的深圳第一...
蔚来在安庆成立新能源科技公司 ... 天眼查App显示,近日,安庆蔚来新能源科技有限公司成立,法定代表人为姚蒀,注册资本500万人民币,经...
美国牛肉商期盼峰会重启对华出口 据路透社5月8日报道,美国牛肉生产商正期待特朗普与中国于5月14日至15日的峰会推动对华出口许可恢复...
创业板首家未盈利企业,市值突破... 5月8日,大普微总市值正式突破2000亿元大关。截至午间收盘,大普微涨14.07%,报493.1元/...
招商证券:董事长霍达因工作变动... 招商证券公告,公司董事长霍达因工作变动申请辞去董事长、执行董事等全部职务,辞任自辞呈送达董事会之日生...
原创 中... 【阅读须知】本文所引用的所有信息和数据,均为作者通过查阅官方资料与网络公开数据整理、分析而成,旨在为...
原创 从... 2026年5月5日,中国商务部发布了一项具有划时代意义的专项阻断禁令,这份公告让一向倚仗长臂管辖的美...
布米普特拉北京投资基金管理有限... 美国圣路易斯联邦储备银行总裁穆萨莱姆周三发出明确信号,美联储货币政策面临的潜在风险正在发生关键转向。...
加工的秘密:超精加工设备如何做... 你知道吗? 一根头发丝的直径大约0.07毫米,也就是70微米。 超精加工设备,可切出表面,其尺寸为0...
招商证券董事长霍达因工作变动离... 北京商报讯(记者 刘宇阳 实习生 王思奕)5月8日,招商证券发布关于公司董事长离任暨推举董事代行董事...
华帝股份营收创近3年新低,37... 乐居财经李兰近日,华帝股份(002035.SZ)发布2025年年度报告。 2025年,华帝股份实现营...
大模型融资杀疯了!月之暗面狂揽... 图源:视觉中国 5月7日,据华峰资本官微消息,国内头部大模型公司月之暗面(Kimi)于近日完成新一轮...
扎根长宁二十余载,仲利国际融资... 作为总部扎根上海长宁的优质台资金融企业,仲利国际融资租赁有限公司深耕融资租赁行业二十余载,始终坚守金...
估值210亿!李彦宏又将收获一... 来源:直通IPO,文/王非 国产GPU上市潮仍然汹涌,继两家登陆A股、两家登陆H股后,这家公司正推进...
基金“盲盒”拆了 公募基金正在迎来一场让投资者“看得懂”的变革。 近日,华夏、易方达、南方、招商等12家头部及特色基金...
原创 2... 前言 十年间,中国企业在印尼镍产业链累计砸下超过140亿美元,电厂、公路、码头和全套生产线,硬生生...
原创 欧... 俄罗斯卫星通讯社5月6日报道,欧盟宣布禁止欧洲银行为含有来自不可靠供应商的关键部件的可再生能源项目提...
原创 余... 2026年5月2日,在中国理财市场扎根十三年的余额宝,终于触碰到了一个让所有人错愕的数字——7日年化...
银华基金增聘谭普景共同管理银华... 来源:新浪基金∞工作室 5月8日,银华基金管理股份有限公司发布公告称,为银华中证机器人交易型开放式指...