一次fd错误追踪分析

前老东家的项目经理qq咨询我说遇到设备端里面的程序自动重启,观察调试日志有下面信息:

May  8 15:49:03  xx_server: ***read fd = 22 read error  Bad file descriptor**

May  8 15:49:03  xx_server: handle_distribution_cmd_child:pollerr fd = -1277165504,errid=49

May  8 15:49:03   mpd: client: [341] closed

May  8 15:49:03   mpd: client: [342] closed

May  8 15:49:03   mpd: client: [340] closed

May  8 15:49:03   kernel: [ 1083.214089] usb 1-1: clear tt buffer port 1, a3 ep1 t81008d8a

May  8 15:49:04   watch_server: restart xx_server

项目经理介绍该现象无规律,三台机器出现了一台,而出现的这台机器下午继续实验又出现了一次,暂时没有发现其他规律。

分析过程:

根据描述和调试信息,初步推断是由于xx_server读取文件描述符出错导致程序异常退出后守护进程重新启动了xx_server,由于server的重新启动,导致以前外部建立的链路都中断被用户感知。

打印出来的fd是一个明显很异常的值,根据经验,出现这种情况一般有两个:1 指针越界访问  2 访问被释放没有归零的指针。

让工程师用gdb运行跟踪,出现异常后gdb出现下面信息:

因为所有错误都是和fd有关,重点查看操作该fd的代码,我把故障点代码贴出来,大家可以看下问题点:

 

该段代码是引用网络上的代码但是被工程师根据具体需要改动过(虽然我曾经是这个项目的总负责人,但是具体的代码也都是下面工程师写,我仅知道架构和代码大致运行流程)。经过分析里面fd操作,发现了问题点。

故障点我在这里标红:

代码逻辑没有考虑到这种异常情况:

it = pollfds.erase(it); 操作后如果刚好it等于end,前面的for循环还是会继续做it++,自增动作导致it已经越界,导致逻辑判断it != pollfds.end() 仍然成立进而进入对it的fd进行访问导致越界。

把以上分析告诉项目经理对代码进行修正后该问题排除,一个困扰老东家的问题远程搞定。

 

CAN FD协议中的CRC错误是指在CAN总线通信过程中,接收节点判断CAN帧信息的完整性时发现CRC校验失败的情况。CRC错误检测是一种重要的错误检测手段,用于确认CAN帧信息是否正确。在CAN FD协议中,为了提高故障检测能力,CRC计算方法发生了变化,引入了填充位和额外的奇偶校验位。CRC以含填充位的位流进行计算,并根据数据场长度选择不同的CRC生成多项式。对于CAN-FD协议,CRC场扩展到了21位,适用于帧长小于1023位的帧。\[1\]\[2\]\[3\]所以,当CAN FD协议中的CRC校验失败时,表示接收节点检测到了数据帧的完整性问题,可能是由于数据传输过程中发生了错误或干扰导致的。 #### 引用[.reference_title] - *1* *2* [详解CAN/CAN FD通信中的循环冗余校验(CRC)方法](https://blog.csdn.net/weixin_39576133/article/details/111497696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [深度解析CAN-FD与CAN协议的差别](https://blog.csdn.net/weixin_42300956/article/details/111989234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值