Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
poll
select
select poll bug 导致内存泄漏
发布于 2023-08-16 09:55:26 浏览:534
订阅该版
[tocm] rt_free重入的问题: ## 现像 主循环采用select函数监听多路网络以及rt_pipe管道,经常会出现内存耗尽的问题。跟踪代码发现select会调用malloc与free,且rtt的select是用poll实现,于是放弃select直接采用poll函数替代。换成poll后运行也时常出现“hardfault"。于是进行不断的代码屏蔽排除以缩小范围,始终无法定位原因。怀疑rtt的heap有问题,于是将heap换成自已实现的,但是并没有解决问题。 ## 解决方法 最后发现heap的调用会有重入的问题,但是我明明有用rt_mutex保护,将rt_mutex换成rt_sem也是一样不能解决问题。但是如果用`rt_enter_critical()`或是用`rt_hw_interrupt_disable()`来保护heap,就可以很稳定的运行。 但是问题的本质原因没有找到,所以这里想问下rt_mutex与rt_sem失效的可能因素有哪些,如何进一步查找。 注意到每次发生重入都是在`dfs_pool.c -> poll_teardown() -> rt_free()`上发生的,所以问题有没有可能在`poll_teradown()`上。 ```c static void poll_teardown(struct rt_poll_table *pt) { struct rt_poll_node *node, *next; next = pt->nodes; while (next) { node = next; rt_wqueue_remove(&node->wqn); next = node->next; rt_free(node); } } ``` 重入的检测方法: ```c static volatile uint32_t v = 0; void *rt_malloc(rt_size_t size) { void *ret; rt_sem_take(&heap_sem, RT_WAITING_FOREVER); v ++; if (v > 1) { while(1); } ret = my_malloc(size);//自定义heap的方法 v --; rt_sem_release(&heap_sem); return ret; } void rt_free(void *rmem) { rt_sem_take(&heap_sem, RT_WAITING_FOREVER); v ++; if (v > 1) { while(1); //会死在这里 } my_free(rmem); //自定义heap的方法 v --; rt_sem_release(&heap_sem); } ```
查看更多
4
个回答
默认排序
按发布时间排序
owlly
2023-08-16
这家伙很懒,什么也没写!
建议检查一下 rt_sem、rt_mutex 的返回值。
NR1101
2023-10-09
这家伙很懒,什么也没写!
你好真正原因找到了吗?我也是这样感觉的,但是看了几遍poll的代码,未发现问题
Exxfire
2024-01-02
这家伙很懒,什么也没写!
发现这里有个BUG: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/a082f4dc0a5364b88e62b7c69a6ac594.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240102/0fd83c86073cce59d47d1870cf73d53b.png.webp) 不带箭头红色方框内是我加的,原来的代码在找不到 dfs_fd找不到的时候,do_pollfd() ret > 0 , 再返回到select , 实际效果是在没有接收到监听的事件的情况下,没有成功阻塞到设置的超时时间就退出,造成死循环。
CrazyH
2024-01-02
这家伙很懒,什么也没写!
可以提PR的
撰写答案
登录
注册新账号
关注者
1
被浏览
534
关于作者
xuewenhui
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
rt-thread的多线程非阻塞网络编程server的例程有吗
2
RTT标准版中posix poll接口使用疑问
3
接收数据不触发select
4
之前select死循环的问题查清楚了
5
支持多个fd同时select,目前的rtt貌似不支持
6
非阻塞 socket
7
使用fifo通道读取数据select不返回
8
select不返回问题,昨天未描述清楚
9
请问Kconfig中select 如何选择非bool值的config的值呢
10
tcpclient_select_sample 等待网络函数参数问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部