聊聊ASSERT处理在某些场景下的合理用法
先看看ASSERT的介绍:
编写代码时,我们总是会做出一些假设,ASSERT断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
案例:
最近在跟一个客户反馈的bug,客户是做的安防家用云台机监控设备,说“设备挂测后异常,无法正常使用”的问题,也就是产品在老化的时候,本身应该是在APP端可以实时查看设备推流的视频的,幸运的是客户抓到了运行日志,以前客户也老化过很长时间未出现过这种问题,当客户把问题反馈到对外沟通群,公司甚是重视,立马组织兵力调查,千万不能耽误客户量产。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
调查分析:
接到这个任务后,查阅了日志,日志足足抓了有三十MB,启动大脑快速搜索蛛丝马迹,终于看到一个比较明显的错误,如下:

*********IDRFRAME_OVERFLOW ,frame_lost,len=86400************
[h264_vdi_enc_one_frame] H264_code_frame: overflow
也就是说编码溢出了,在某些场景下,图像噪点麻点太多,导致预设的编码输出buffer不够存放编码出这张图的编码后数据,导致overflow。还好提示够明确,不然又不好复现真实要抓狂。找到H264 PictureBuffer.c: 535行看了一下,就是一个ASSERT处理,为啥会卡住呢?点开这个ASSERT的定义真是一目了然啊!如下


兄弟啊,这ASSERT里面居然有个while(1),真的要崩溃了,不就卡死在这里面吗?
找到问题点后,找对应负责这个模块的工程师同事沟通了一下,给我的建议是降低QP配置,也就是编码质量往下降一点,编出来的数据量会小一点,这当然也是一个有效手段。但是我觉得这还是一个问题,变成一个更加难复现的问题,从本质上、原理上还是存在再进入这个ASSERT在这里执行while(1)的可能性,概率虽然会降低,但是出现了它的后果是相当于死机的TOP0级别了,不容忽视吧!
谈了一下我的想法,这种硬件视频编码器如果数据大了不够存,大不了就不要这个数据了嘛,这一帧编码失败返回就行了, 顶多影响一个GOP的数据吧,这顶天了!你如果一直在while(1)不就是等同死机了吗?因此我建议去掉while(1)处理,有错了就返回重新再出发,不必卡死在那。
心得体会:
有些错误我们是可以预估到,但是没法完全避免,首先我们要有防错的思维,就像我那同事提出的降低编码等级,数据量小了,也是一个有效手段,但是不能以防万一,不能根治;其次,在防错的基础防线上没守住的时候,我们还得有纠错的思路,让损失降低到最小吧!
软件编程防错和纠错都必不可少,多一些质量管理的思维,考虑全面一点,程序也就更健壮一些。
相关文章:
聊聊ASSERT处理在某些场景下的合理用法
先看看ASSERT的介绍: 编写代码时,我们总是会做出一些假设,ASSERT断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真…...
SAP Odata 服务
参考过程 SAP创建ODATA服务-Structure_sap odata-CSDN博客 案例...
【java数据结构】栈
【java数据结构】栈 一、栈的概念二、 栈的使用三、 栈的模拟实现(数组)构造方法size()empty()push()pop()peek() 四、 栈的模拟实现(链表)构造方法size()empty()push()pop()peek() 五、 栈的例题 此篇博客希望对你有所帮助(帮助你了解栈),不…...
从头开始的可视化数据 matplotlib:初学者努力绘制数据图
从头开始学习使用 matplotlib 可视化数据,对于初学者来说,可能会有些挑战,但 matplotlib 的核心理念非常清晰:绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …...
vscode 远程linux服务器 连接git
vscode 远程linux服务器 连接git 1. git 下载2. git 配置1)github 设置2)与github建立连接linux端:创建密钥github端:创建ssh key 3. 使用1)初始化repository2)commit 输入本次提交信息,提交到本…...
不同jdk版本中的接口规范
Java Development Kit(JDK)的每个版本通常会对 Java 语言和类库进行改进,接口规范也在不断演进。Java 接口的演变是逐步从 “纯粹抽象的定义” 向 “具有行为的抽象定义” 演化的。 JDK 1.0 和 JDK 1.1JDK 1.2 到 JDK 1.6JDK 1.8(…...
人工智能图像信号处理器(AI ISP)技术介绍
随着智能设备和数码成像技术的快速发展,图像质量的提升成为用户体验的关键因素之一。人工智能图像信号处理器(AI Image Signal Processor,AI ISP) 作为传统图像信号处理器(ISP)的升级版,通过集成…...
3D Slicer 教程三 ---- 坐标系
上篇提到3D Slicer 教程二 ---- 数据集-CSDN博客 3d slicer的坐标系与大多数医学影像软件使用LPS(左、后、上)坐标系统不太一样, 今天就仔细介绍一下坐标系的区别,复盘一下在影像处理中遇到的坐标问题(集中在坐标处理相关的,图像插值,图像处理, 定位线,翻…...
Video-LLaMA论文解读和项目部署教程
Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding 相关工作 大型语言模型: 本文的工作基于这些LLM,并提供即插即用插件,使其能够理解视频中的视觉和听觉内容。 多模态大型语言模型: 现有…...
Elasticsearch设置 X-Pack认证,设置账号和密码
前言 以下Elasticsearch版本:7.9.3 ES自带的X-Pack密码验证: X-Pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,所以我们想要开启账号密码验证…...
机器学习——量子机器学习(Quantum Machine Learning)
机器学习——量子机器学习(Quantum Machine Learning) 量子机器学习(Quantum Machine Learning)——未来的智能计算量子机器学习的核心概念使用Qiskit进行量子机器学习——代码示例代码解析量子机器学习的应用结论 量子机器学习&a…...
Android Studio 的 Gradle 任务列表只显示测试任务
问题现象如下: 问题原因: 这是因为Android Studio 设置中勾选了屏蔽其他gradle任务的选项。 解决方法: File -> Settings -> Experimental 取消勾选Only include test tasks in the Gradle task list generated during Gradle Sync&…...
Keepalived:高可用性的守护神
Keepalived:高可用性的守护神 在现代企业IT系统中,高可用性是确保业务连续性和服务质量的关键要素。系统面对硬件故障、软件错误、人为失误或自然灾害时,依然能保持正常运行,这样的能力对于企业来说至关重要。为此,业界开发了一系列高可用性解决方案,其中Keepalived以其…...
Golang笔记_day08
Go面试题(一) 1、空切片 和 nil 切片 区别 空切片: 空切片是指长度和容量都为0的切片。它不包含任何元素,但仍然具有切片的容量属性。在Go语言中,可以使用内置的make函数创建一个空切片,例如:…...
如何在 React 中更新状态对象的某个值
在 React 中,我们经常需要更新组件的状态来反映 UI 的变化。如果状态是一个复杂的对象,比如一个包含多个筛选条件的对象,我们希望只更新其中的某个键,而不是整个状态对象。今天,我将向大家展示如何在更新状态时保留已有…...
edge浏览器:你的连接不是专用连接
最近在使用edge浏览器打开github时,发现打不开了,提升你的连接不是专用连接。试了很多种方法甚至重装了浏览器,都没有用。 直到看到了这篇文章,才得到解决: 10 个修复此站点在 Windows Edge 上的连接不安全的问题htt…...
PDF 软件如何帮助您编辑、转换和保护文件
如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的…...
如何使用Java爬虫处理API接口返回的JSON数据?
处理API接口返回的JSON数据是Java爬虫开发中的一个常见任务。在Java中,有多个库可以帮助我们解析JSON数据,其中最流行的是Jackson和Gson。以下是使用这两个库处理JSON数据的基本步骤和示例代码。 使用Jackson处理JSON Jackson是一个功能强大的JSON处理…...
Ajax是什么?
Ajax是什么? Ajax是创建交互式网页应用的网页开发技术。简单来说就是网页在不加载的情况下,可以跟服务器交换数据,并更新页面的内容。 原理: 1. 创建xhr(xmlHttpRequest)对象; 2, 通过xhr对象的open()方法和…...
技术方向简介
掌握 Java基础,包括OOP思想、集合、常用的设计模式;熟悉基本的数据结构和算法; 掌握JVM虚拟机和Java多线程并发编程,熟悉线程池、线程安全机制、锁的使用; 熟悉MySQL、Oracle等关系型数据库锁、事务、索引相关知识,了解DDL原理&…...
OpCore-Simplify:颠覆性重构开源系统硬件适配流程,从8小时到30分钟的效率革命
OpCore-Simplify:颠覆性重构开源系统硬件适配流程,从8小时到30分钟的效率革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify …...
车规 vs 工规:智能座舱到底有没有“必要上车规”?一篇讲透成本、风险与真实行业做法
🚗 车规 vs 工规:智能座舱到底有没有“必要上车规”?一篇讲透成本、风险与真实行业做法 在汽车电子领域,“车规器件”几乎成了默认选项。但随着智能座舱算力暴涨、成本压力加剧,一个现实问题正在被越来越多团队重新审视: 中控、TBOX、娱乐系统,是否必须全面车规? 这不…...
统信UOS桌面系统高效运维:从入门到精通的命令行指南
1. 为什么你需要掌握统信UOS命令行? 第一次接触统信UOS桌面系统时,很多人都会被它精美的图形界面吸引。但真正用过一段时间后,你会发现图形界面虽然友好,但在处理批量操作、远程管理、自动化任务时效率远不如命令行。我刚开始用U…...
【技术干货】从 Gemma 4 到本地智能体:打造可落地的 Local AI 工作流实战
摘要 本文围绕 Google 最新开源模型家族 Gemma 4,系统梳理其技术特性、模型选型思路,并结合 Ollama Hermes Agent / Open-Chat,搭建一套可在本地落地的智能体(Agent)工作流。同时补充云端 OpenAI 兼容 API 的调用示例…...
从安装到投产:企业级AI编程工具落地全流程避坑指南(以文心快码私有化部署为例)
从安装到投产:企业级AI编程工具落地全流程避坑指南 当企业决定引入AI编程工具时,技术选型只是万里长征的第一步。真正考验IT团队的是如何将工具无缝融入现有研发体系,同时平衡效率提升与安全合规。本文将基于文心快码私有化部署实践…...
SecGPT-14B效果展示:输入YARA规则条件,AI生成正则匹配优化建议与误报规避
SecGPT-14B效果展示:输入YARA规则条件,AI生成正则匹配优化建议与误报规避 1. 引言:当AI遇见网络安全规则 想象一下,你是一名安全分析师,面对成千上万条日志,需要编写一条精准的YARA规则来捕捉一个新型恶意…...
从本地事务到分布式一致性:Python 工程师必须掌握的数据库事务、Saga、Outbox 与补偿实战
从本地事务到分布式一致性:Python 工程师必须掌握的数据库事务、Saga、Outbox 与补偿实战 很多开发者第一次接触“事务”,通常是在数据库课上学到一句话:事务要么全部成功,要么全部失败。 这句话没错,但只说对了一半。…...
中文文献管理高效解决方案:Jasminum插件全方位应用指南
中文文献管理高效解决方案:Jasminum插件全方位应用指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在学术研究与文…...
QtScrcpy:打破设备边界的精准操作映射技术指南
QtScrcpy:打破设备边界的精准操作映射技术指南 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 当医生需要在远程医疗场景中通过触屏设备进行精细手术模拟时,…...
Qwen3.5-2B轻量化设计原理:MoE稀疏激活+动态token压缩技术详解
Qwen3.5-2B轻量化设计原理:MoE稀疏激活动态token压缩技术详解 1. 模型概述 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型,专为低功耗、低门槛部署场景设计。该模型采用20亿参数规模,在保持良好性能的同时显著降低了资源占用࿰…...
