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 成员地址就是非法的内存地址(小地址),就会出现异常死机

小结

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

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

相关内容

热门资讯

雷军:只有懂车、爱车,才能造好... 近日,在小米赛道体验日上,微博认证为小米公司新媒体总监的“神得强Steven”发微博称,参加小米赛道...
豪掷95亿!歌尔股份,继续加码... 文|侃见财经 伴随着苹果高增长不再,消费电子巨头们加速逃离苹果产业链已然是大势所趋。 不过,歌尔股...
智慧医疗新革命:DeepSee... 免责声明 本文引用的参考文献搜集于互联网,非原创,如有侵权请联系小编删除! 请勿将该文章用于任何商业...
A股,三大利好来袭! 多则利好消息引发市场关注! 近日,高盛将未来12个月MSCI中国指数的目标从85上调至90。同时,高...
和讯投顾王帅:沪指再创新高,不... 不要去追热点,抓好5个方向就可以了。和讯投顾王帅表示,今天的创业板又继续新高,但是对于沪指来说是反复...
三友科技:7月28日融资买入1... 证券之星消息,7月28日,三友科技(834475)融资买入116.81万元,融资偿还45.95万元,...
原创 特... 据报道,美国对韩国加征25%关税的最后期限近在眼前。与此同时,华盛顿正加紧向首尔施压,要求其将《美韩...
荣联科技跌0.75%,成交额1... 来源:新浪证券-红岸工作室 7月28日,荣联科技跌0.75%,成交额1.47亿元,换手率2.78%,...
烧15亿,把头像贴满地铁站,雷... 文|《BUG》栏目 闫妍 北京西二旗地铁站,腾讯、百度、网易、滴滴等知名大厂在此扎堆,这是北京最著名...
每孩每年3600元,育儿补贴官... 无论一孩、二孩、三孩,均可申领育儿补贴 文|《财经》记者 王静仪 编辑|王延春 流传数月的育儿补贴政...
成都实现境外银行卡“直刷”坐地... 7月28日,成都地铁正式上线银行卡刷卡过闸功能,乘客持银联卡及境外发行的维萨卡(Visa)、万事达卡...
李嘉诚突发!长和一纸公告,坐实... 金融界7月28日消息 李嘉诚旗下的长和一纸公告出售港口一事迎来最近进展,坐实内地企业加入交易的传闻。...
坚持绿色发展,华帝荣获《证券之... 7月25日,2025证券之星ESG年度论坛暨第三届ESG新标杆企业奖颁奖盛典在上海盛大举行。作为厨电...
1219亿美元!全球AI领域吸... 人工智能领域正经历着前所未有的资本汇聚浪潮。2025年上半年,全球AI领域吸引风险投资1219亿美元...
美股散户狂欢背后,华尔街空头本... 美股散户持续上演狂欢的同时,华尔街空头正遭受惨痛打击。 S3 Partners数据显示,截至上周四,...
广期所出手,推进光伏组件期货研... 来源:集邦新能源网 集邦光储观察获悉,在近期中国光伏行业协会主办的光伏行业2025年上半年发展回顾与...
原创 左... 作者︱余在洋 与其抱怨环境糟糕,不如弯腰探求“活下来”的创新之道。就像上海这位面馆老板,他用“左手一...
股市必读:金博股份(68859... 截至2025年7月28日收盘,金博股份(688598)报收于27.23元,上涨0.67%,换手率2....
原创 高... 8天。2025年春节高速免费通行长达8天,7座及以下小客车全程免单。你是不是也想薅羊毛?想玩个骚操作...
标普500指数屡创新高,大型科... 21世纪经济报道记者舒晓婷 北京报道 受强劲业绩以及最新贸易动态提振,过去一周美国三大股指集体收涨。...