死机问题--arm_linux死机问题排查记录

1、背景

最近在一个项目的GB28181客户端程序中,当GB程序开始拉流时,就会出现死机(应用同一份代码在其他平台正常)。根据这段时间的排查记录,将这些排查手段进行记录。

2、排查手段

下面是设备进行拉流时,设备死机的日志:

[15:38:51:702][GB28181]DBG (Trunk/src/gb28181_client.c|gb28181_parse_invitebody|1261): ip<->port:172.16.10.23:44134, ichn:0,  realplay_did:2
[15:38:51:702]u32MediaPort:44134
[15:38:51:702]setNeedForceIFrame ichn:0, onoff:1
[15:38:51:703]setNeedForceIFrame1 ichn:0, onoff:1
[15:38:51:720]setNeedForceIFrame ichn:0, onoff:1
[15:38:51:720]setNeedForceIFrame1 ichn:0, onoff:1
[15:38:51:720]setNeedForceIFrame ichn:0, onoff:0
[15:38:51:720]svcmgr: service 'BinderServiceMedia' died
[15:38:51:720]svcmgr: service 'venc_service' died
[15:38:51:721]svcmgr: service 'aud_service' died
[15:38:51:723]svcmgr: service 'fire_service' died
[15:38:51:733]svcmgr: service 'iva_service' died
[15:38:51:733]svcmgr: service 'vi_service' died

(1)定位死机打印附近的代码

从日志上看,死机时打印setNeedForceIFrame ichn:0, onoff:0,那么在出现死机时打印的地方先定位代码编码是否存在问题,一般可以采用注释函数调用走读代码发现问题。

(2)找出差异

由于当前死机的平台上,GB28181的SIP库换成了libexosip2-5.2.0和libosip2-5.2.0(以前的平台上军是libeXosip2-3.6.0和libosip2-3.6.0),因此为了控制变量,想办法在当前平台上也使用libeXosip2-3.6.0和libosip2-3.6.0,这个过程遇到一些编译问题,编译问题可参考编译问题–arm_linux编译问题记录
但是当使用这个版本的库时,问题还没有得到解决,设备照样死机。

(3)修改线程栈的大小

由于上述办法都没有解决问题,因此可以先想办法获取当前死机线程的剩余线程栈大小(比如使用pthread相关函数),但是我们的这个内核这个用不了,因此可以采取一些曲线办法,比如在函数里面定义一个数组。通过这个办法看起来,线程栈的大小也比较大。

(4)使用GDB

在上述办法没有定位出问题后,我们采用了GDB调试,但是GDB有很多功能用不了,由于对GDB不熟悉,没有深究不能使用的功能。

(5)修改编译的优化选项

比如你的代码存在-O2的优化选项,那么将其去掉,看看设备是否存在死机问题。

(5)使用内存定位工具

目前在移植valgrind,这个工具是一款功能比较多的工具,后面移植成功,再将移植过程写出来。

### ARM Linux 系统崩溃原因 当ARM Linux系统发生崩溃时,常见的原因可以归纳为以下几个方面: - **内存管理问题**:Linux系统具备OOM Killer机制来应对内存不足的情况[^1]。如果系统中存在大量占用内存的应用程序或服务未能被有效处理,则可能导致其他重要进程无法获得足够的资源而终止。 - **硬件故障**:包括但不限于CPU过热、电源供应不稳定以及存储介质损坏等问题都可能引发操作系统层面的异常行为并最终造成系统崩溃。 - **内核模块冲突或缺陷**:不兼容或者有Bug的设备驱动程序会干扰正常的I/O操作流程,在极端情况下可致使整个计算机平台失去响应能力;此外,不当配置也可能触发此类状况的发生。 - **文件系统损坏**:由于意外断电或其他因素引起的元数据结构破坏会使根分区变得不可访问,进而影响到依赖于这些路径下的各类应用和服务的功能实现。 - **应用程序错误**:某些特定条件下运行的应用软件内部逻辑漏洞亦能间接促使主机进入死机状态,特别是那些拥有较高权限级别且频繁调用底层API接口的任务实例更为危险。 ### 解决方案与预防措施 针对上述提到的各种可能性,采取如下策略有助于缓解乃至彻底消除隐患: #### 调查诊断工具运用 利用诸如`dmesg`, `journalctl -xb`命令获取日志记录以便快速锁定可疑对象及其关联事件链路;借助GDB调试器深入剖析核心转储文件(Core Dump),从而精准定位根本诱因所在位置[^3]。 ```bash $ dmesg | less $ journalctl -xb ``` #### 内存优化建议 定期监控剩余RAM容量变化趋势图谱,一旦发现异动迹象立即着手排查是否存在泄漏现象或是不必要的后台作业正在消耗过多份额;适当调整swappiness参数值以平衡物理页框交换频率,确保关键业务不受冲击的同时兼顾整体效率最大化[^4]。 ```bash vm.swappiness=10 ``` #### 驱动更新维护 保持所有外设控制器固件版本处于最新稳定态,并积极跟进上游社区发布的安全补丁集合,及时修补已知风险点位;编写自定义加载项前务必充分测试其稳定性表现,避免引入新的不确定性因子。 #### 文件系统校验恢复 采用fsck实用程序扫描修复受损节点链接关系,重建索引表单确保目录树状层次清晰有序;对于重要的资料库应建立冗余备份副本以防万一遭遇突发事故仍能迅速切换至替代源继续提供不间断的服务支持。 ```bash $ sudo fsck /dev/sdaX ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值