- 博客(173)
- 资源 (14)
- 收藏
- 关注
原创 【内存优化】内存优化以及oom排查整体思路
本文总结介绍了项目开发过程中oom排查和内存优化的一些方法,主要是从内存问题查看到堆内存、栈内存、数据段内存优化为导向,结合实际优化实例介绍工具和方法的运用,展示每种优化方法优化过程,希望对读者有所帮助。
2023-07-09 13:09:15
3079
原创 【死机】setenv设置环境变量偶现死机
部分读者可能不关注详细分析过程,这里直接说明一下结论:setenv接口在设置环境变量时,可能会调用realloc来扩充存储环境变量的内存,由于realloc实现机制,realloc返回的地址有可能和我们传入待扩容的地址是不一样的;因为没有多线程异步保护,getenv访问到realloc已经释放的内存,导致死机。一般死机出现在getenv中则大概率是该原因导致的。总之程序运行之后,禁止再去修改环境变量,可能导致死机。
2023-07-06 23:16:11
414
原创 【死机】dlopen_dlsym缺失符号导致的段错误死机
本文首先以一个案例描述了死机现场和死机的原因,然后介绍了运行时加载和直接动态链接的区别,并介绍了动态库加载函数dlopen、dlsym、dlerror函数的使用方法,特别是RTLD_NOW在dlopen检测所有符号是否链接,以及RTLD_NEXT在malloc重载定位内存泄漏的使用。
2023-07-06 22:57:03
747
原创 【内存优化】数据段大小分析
可执行程序中数据段的内存并不需要我们自己管理,在进程加载的时候系统自动为这些数据分配了内存,所以数据段的大小也作为我们内存优化时的一项,有必要对其进行分析。本文介绍一下数据段都存储的什么以及如何统计.rodata、.bss、.data中存储的变量的大小。
2023-07-06 22:30:02
500
原创 【内存优化】代码段大小分析
程序运行需要加载到内存中,代码段的大小直接影响到内存的使用,所以可以从代码段的角度来对内存进行优化;本文就分享一下如何统计可执行程序中链接的各个库代码段的大小。本文只介绍原理,如果链接的库比较少的话可以直接按照下面方法分析,大型项目中链接的库可能比较多,可以按照下面原理写脚本解析。
2023-07-06 22:03:19
383
原创 【堆越界】堆内存越界问题排查
堆越界在实际工作开发中也属于一个比较常见的问题,一般死机的位置是被踩的,并不是第一现场,这种问题集成内存分析工具(asan)排查是比较方便的,但是在真实项目开发中,工程链接的库在上百个,每个库都去开启asan编译选项没那么方便,掌握直接排查堆越界问题的方法是很有必要的。 本文基于嵌入式linux平台,以一个堆越界的死机案例,讲述了如何只使用gdb分析core文件确定是哪里越界导致的程序死机。
2023-06-17 12:12:53
1922
2
原创 【内存优化】内存泄漏问题排查_malloc重载
C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰。本文提供一种通过wrap malloc查找memory leak的思路,有静态链接和动态链接两种方法,依靠这个方法,解决了大量内存泄漏问题,该方法在日后工作中大放光彩,发现了项目中大量沉疴已久的内存泄漏问题。
2023-06-17 11:11:37
1287
原创 【内存优化】栈上局部变量定义过大导致设备oom
透明大页(Transparent Huge Pages),RHEL 6 开始引入,目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。这里我先介绍一下遇到的问题,读者可以思考一下,遇到下面这个问题导致的oom,目前自己现有的知识是否可以解决。由于栈的内存是操作系统本身进行管理的,所以我们无法通过现成的工具来统计线程实际使用了多少物理内存,不过操作系统也提供了便捷的方式让我们可以查看线程栈内存,那就是smaps信息。
2023-06-17 10:40:33
509
原创 【栈越界】栈被破坏导致的死机
在众多的coredump中,有一类crash调试起来是最麻烦的,那就是“栈被破坏”导致的函数调用回溯结构破坏引发的coredump。本文,主要讲讲这一类crash的成因、原理以及调试方法、如何还原堆栈并定位该问题
2023-06-14 22:59:42
989
原创 【工具】Valgrind定位内存越界
valgrind 是一套 Linux 下,开放源代码的动态调试工具集合,能够检测内存管理错误、线程 BUG 等,valgrind 由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。Memcheck内存错误检测器:它有助于使你的程序,尤其是那些用C和C++写的程序,更加准确。
2023-05-15 12:45:38
1141
原创 【经验分享】软考-高级系统架构师经验分享
为了杭州E类人才的优惠政策,开始准备高级系统架构师考试,历时3个月,做了一个总结和经验的分享,帮助有需要的人。
2023-05-13 11:19:32
1186
原创 【工具】Asan快速定位内存越界、内存泄漏
asan检测内存漏洞(堆踩内存、栈越界、堆越界、使用未初始化的内存等)和内存泄漏,如果不使用工具,我们直接去排查,那成本将是巨大的,我们曾经解决过野指针问题,公司专家六七个人,开会实现研究复现找规律,分析了两周才得以解决,如果使用asan,可能也就1天搞定。
2022-12-14 23:46:27
3120
2
原创 【工具】perf性能分析_CPU idle为0
本文主要介绍perf在嵌入设备,在真实工作产品化项目中,集成perf过程中遇到的问题和踩过的坑,指导你如何用perf来分析并解决CPU idle为0的问题。
2022-12-12 23:31:41
1402
3
原创 DDR焊接短路导致内存异常
作为嵌入式软件开发工程师,开发调试过程中,遇到业务上的问题,基本不会往硬件方面考虑;特别是针对本文要描述的此类问题,开始一度怀疑是软件踩内存,排查到最后尽是ddr硬件焊接短路导致的地址索引异常。本文对该问题的排查思路作出分享,帮助读者积累一些经验。另外介绍了在分析过程中使用的内存测试工具memtester如何在嵌入式环境交叉编译执行。
2022-12-11 16:07:33
854
原创 问题排查专栏总述
工作经验不是用你工作了几年来衡量的,哪怕你工作10年,但这10年你干的活内容是一样的,没有进取,那你的工作经验就是一年;以前奉行着在工作中成长,现在想法变成了在成长中工作;工作几年一直在寻找一个问题排查的专栏,想跳过自我总结这一步,直接拥有5-10年的工作经验,想要工作5年却有着别人10年的工作经验,但到目前为止遗憾也没能找到这么一个专栏,现在自己工作这么些年了,成长为公司专家,解决了很多问题,对自己的解决的问题做一个深挖、回忆、总结,同时也分享出来方便大家借鉴。
2022-12-11 13:03:46
995
2
原创 【工具】linux strace工具使用问题定位_跟踪系统调用
在嵌入式设备交叉编译strace,结合工作实际经验,总结了编译遇到的各种问题,并且在strace中集成了libunwind和libiberty用于支持-k参数打印堆栈和显示demangle符号;最后结合工作中项目实践经验分享了利用strace解决过的问题
2022-12-11 12:06:24
970
5
原创 【经验分享】嵌入式软件工程师工作经验分享
既然你能搜到这篇文章,说明你像过去的我一样遇到了迷茫期,不知道该何去何从,感觉人很迷茫、压抑,可能也学了很多东西,但是又感觉啥都不会一样;想进步、想提升但是也没有一个方向。分享一下我自己工作中的一些经验心得和针对这种迷茫期的一些想法.........
2022-06-18 13:23:43
4487
4
原创 【流媒体开发】21、H264 NALU分析
视频编码在流媒体和⽹络领域占有重要地位;流媒体编解码流程⼤致如下图所示:1、H264简介H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准称为H.264,在MPEG的标准⾥是MPEG-4的一个组成部分–MPEG-4 Part 10,叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。2、H264 编解码解析参考链接: H264 编解码协议详解;深⼊浅出理解视频编码H264结构;详细⽂档;H264编解码框图;3、H
2021-10-10 21:41:19
821
1
原创 【流媒体开发】19、FFMpeg解封装流程分析
1、理解解封装流程和函数调用2、duration和time_base的理解一、前言本节描述使用ffmpeg解封装,解封装其实就是将flv、mp4等文件中的音频和视频数据剥离出来,MP4拆分成AAC和H264文件等。二、封装相关函数接口avformat_alloc_context(): 负责申请一个AVFormatContext结构的内存,并进行简单初始化avformat_free_context(): 释放该结构里的所有东西以及该结构本身avformat_close_input(): 关闭
2021-09-30 16:29:37
450
原创 【流媒体开发】18、FFmpeg内存模型
本文介绍了AVPacket和AVFrame两块buffer是怎么管理的,并梳理了所有相关的接口,介绍这些接口内部 具体实现了什么。一、引出问题:1、从av_read_frame读取到一个AVPacket后怎么放入队列?2、从avcodec_recevice_frame读取到一个AVFrame后又怎么放入队列?二、拷贝从现有的Packet拷贝一个新Packet的时候,有两种情况:浅拷贝:两个Packet的buf引用的是同一数据缓存空间,这时候要注意数据缓存空间的释放问题;深拷贝:两个Pa
2021-09-30 09:59:55
504
原创 【流媒体开发】17、FFmpeg基础入门、API、结构体
一、播放器框架二、常用音视频概念容器/文件(Conainer/File): 即特定格式的多媒体文件,比如mp4、flv、mkv等。媒体流(Stream): 表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器(有些码流音频他是纯PCM)。数据帧/数据包(Frame/Packet): 通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
2021-09-26 20:52:20
500
原创 【流媒体开发】16、SDL-PCM播放
本节主要介绍使用SDL接口实现音频PCM数据的播放,具体实现可以在大致了解SDL接口的前提下,参考下面的程序解析和代码实现。SDL接口介绍打开音频设备int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained); // desired:期望的参数。// obtained:实际音频设备的参数,一般情况下设置为NULL即可。在ffplay的实现中会使用第二个参数,到时再详细介绍入参结构体SDL_Aud
2021-09-24 21:21:00
264
原创 【流媒体开发】15、SDL-YUV播放
本节使用SDL实现YUV数据的显示输出,其实就是读取一个YUV文件,然后每过40ms读取一帧YUV送SDL显示,接口调用如下,都很简单,看下就懂。SDL视频显示的流程:运行结果程序解析:1、程序退出: 点击窗口右上角×,SDL会发送一个自带的SDL_QUIT事件,将s_thread_exit = 1,置为1之后,刷帧线程就会退出,然后再发送一个事件QUIT_EVENT,这个时候显示的主线程while才会退出。2、窗口拉伸: 窗口拉伸时会受到事件SDL_WINDOWEVENT,这个时候我们可以获
2021-09-24 20:41:02
192
原创 【流媒体开发】14、SDL线程
sdl线程的创建:这里描述这个的主要原因是因为ffplay是这样实现的,一个线程送解码,一个线程获取解码之后的数据,因为是多线程并且有队列等的管理,所以也使用了锁和信号量基本介绍线程:SDL线程创建:SDL_CreateThreadSDL线程等待:SDL_WaitThead锁SDL互斥锁:SDL_CreateMutex/SDL_DestroyMutexSDL锁定互斥:SDL_LockMutex/SDL_UnlockMutex信号量:SDL条件变量(信号量):SDL_Crea
2021-09-23 23:20:53
591
原创 【流媒体开发】13、SDL事件响应
SDL事件的响应,先给大家一个直观上的理解,通过事件响应我们可以获取到当前键盘敲击的键值,可以获取到鼠标在窗口的位置,可以获取到鼠标当前按下的是左键还是右键等;功能还是比较强大的,ffplay就是使用的SDL来实现一些播放快捷键的。基本介绍函数:SDL_WaitEvent():等待一个事件SDL_PushEvent():发送一个事件SDL_PumpEvents():将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数之前,必须调用SDL_PumpEvents搜集键盘等事件SDL_Pe
2021-09-23 22:23:14
936
原创 QT下SDL窗口创建案例
QT的安装可以参考:QT+FFmpeg4.x Windows开发环境搭建.docx本文基于QT安装之后SDL的工程的创建进行一个描述记录1、创建QT工程2、项目名输入3、头文件和库拷贝到当前路径下,并且在pro文件中指定4、代码初步实现#include <stdio.h>#include "SDL.h"#undef mainint main(){ printf("Hello World!\n"); SDL_Window *window = NUL
2021-09-23 20:48:14
380
原创 【流媒体开发】12、SDL基本介绍
一、SDL简介SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。对于我们课程而言:SDL主要用来辅助学习FFmpeg,所以我们只会关注我们用到的知识点。官网:https://www.libsdl.org/文档
2021-09-23 20:40:47
671
原创 【流媒体开发】11、ffmpeg命令过滤器(裁剪、水印、画中画、多宫格)
一、裁剪裁剪: 是指从原图中抠出一个区域,那么需要裁剪一个区域需要哪些参数呢?左上角起始点的坐标需要裁剪的宽高ffmpeg命令语法:crop=ow[:oh[:x[:y[:keep_aspect]]]]举例说明:裁剪左边1/3ffmpeg -i input -vf crop=iw/3:ih:0:0 outputffplay -i input -vf crop=iw/3:ih:0:0裁剪中间1/3ffmpeg -i input -vf crop=iw/3:ih
2021-09-22 22:34:53
1901
原创 【流媒体开发】10、ffmpeg命令直播
本节主要是学习怎么将网络流保存到本地,并且怎么拉流和推流一、直播拉流一般都是先使用ffplay先测试rtmp链接是否可用ffplay rtmp://server/live/streamName ffmpeg -i rtmp://server/live/streamName -c copy dump.flv对于不是rtmp的协议 -c copy要谨慎使用,-c等价于-codec可用地址HKS:rtmp://live.hkstv.hk.lxdns.com/live/hks2大熊兔(点播)
2021-09-21 20:26:41
356
原创 【流媒体开发】9、ffmpeg实现视频录制
使用ffmpeg通过录制音视频,分为两种:1、一种是录制麦克风和电脑自带摄像头的音视频2、一种是录制电脑系统自带的音频和录屏本节说明一下怎么实现音视频的录制,并且进行一些参数的调节一、安装、设备查看1、dshow软件安装是桌面录制和系统音频录制的一个插件先安装dshow软件 Screen Capturer Recorder,项目地址: https://sourceforge.net/projects/screencapturer/files/2、查看当前可用于录制的设备然后查看可
2021-09-21 19:59:20
3771
原创 【流媒体开发】8、ffmpeg命令视频拼接、图片和视频转换
一、视频拼接1.1生成测试文件找三个不同的视频每个视频截取10秒内容ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4ffmpeg -i 复仇者联盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4ffmpeg -i 红海行动.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4如果音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac
2021-09-21 16:18:27
1118
原创 【流媒体开发】7、ffmpeg基础命令
一、ffmpeg命令参数说明1.1主要参数:-i 设定输入流-f 设定输出格式(format)如果指定了输出格式,后面文件名即便是mp4,输出的也是-f指定的flv,如果不指定则以后缀为准ffmpeg -i Forrest_Gump_IMAX.mp4 -codec copy -ss 10 -t 10 -f flv out.mp4-ss 开始时间-t 时间长度1.2音频参数:-aframes 设置要输出的音频帧数-b:a 音频码率-ar 设定采样率-ac 设定声音的C
2021-09-19 21:03:33
212
原创 【ffmpeg】遇到的问题汇总
问题: 在window7 64bit下安装了ffmpeg,然后用ffplay命令播放声音时发生这个错误:SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can’t initialize audio client,只有视频没有音频解决: 需要先执行一个环境变量:set SDL_AUDIODRIVER=directsound...
2021-09-17 22:11:40
309
原创 windos命令行命令
ffmpeg -h full > ffmpeg_h.log //打印太多可以保存到文件中ffmpeg -h | findstr h264 //在前面的打印中查找264的行并显示ffmpeg -formats | more //显示内容过多,加more分页
2021-09-17 21:09:09
150
原创 【流媒体开发】5、ffmpeg命令帮助、分类查询、基础数据流
本章主要介绍ffmpeg的一些命令,对于ffmpeg的一些基础概念了解可以参考【FFMpeg SDK使用】1、FFMPEG简介与视频处理工具的使用一、FFMPEG如何查询命令帮助文档1.1ffmpeg/ffplay/ffprobe区别ffmpeg: Hyper fast Audio and Video encoder超快音视频编码器(类似爱剪辑)ffplay: Simple media player简单媒体播放器ffprobe: Simple multimedia streams analyz
2021-09-17 20:43:52
189
原创 【流媒体开发】4、环境搭建
0、前言ffmpeg开发环境的搭建分为:1、win10(1)FFmpeg命令行(2)安装vs2015(3)安装QT(4)自己编译FFmpeg2、ubuntu16.041、windows-ffmpeg命令行环境搭建**FFMPEG官网:**http://ffmpeg.org/下载:Shared:包含FFMPEG的dll库文件Static:包含了FFMPEG的官方文档Dev:包含FFMPEG的lib文件/头文件,以及example范例我们目前主要是使用32位的版本搭建:
2021-09-17 20:22:56
129
原创 【流媒体开发】3、封装格式+音视频同步
1、封装格式封装格式:(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀名就是它的封装格式封装的格式不一样,后缀名也就不一样。(比如.mp4(本地存储) .flv(网络传输比较流行)),不同使用场景封装为不同格式例子:这里的压缩算法:视频Video:使用了H264/AVC压缩算法音频Audio:使用了AAC压缩算法封装则使用MP4封装格式常见的视频封装格式H264+AAC封装为FLV或MP4是最为流行
2021-09-16 21:01:54
439
原创 【流媒体开发】2、音频基础
1、声音的物理本质声音是由物体的振动产生的,这种振动引起了周围空气压强的振荡,我们称这种振荡的函数表现形式为波形。(但实际上是有很多个波形组成的)振幅: 表示声音的大小,音量调节就是调节振幅的峰值频率: 周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),即1000Hz,表示每秒振动1000次。声音按频率可作如下划分:次声 0~20Hz人耳能听见的声音 20Hz~20KHz超声 20KHz~1GHz特超声 1
2021-09-16 20:33:28
490
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人