xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。
先阐述一下我的业务场景,我有一个iOS的app sdk项目,下面简称 A ,以及运行 A 的 app 项目,简称 A demo 。
引用关系为 A demo 引用了 A ,而 A 引用了 ffmpeg 的静态库(.a文件)。此时业务出现了 bug ,测试后得知,bug 来自于ffmpeg。现在无法定位ffmpeg的问题出在哪里,需要在程序运行时,断点停在ffmpeg的源码中。而直接拉入ffmpeg是无法下断点的,断点无效(就是代码行数上那个虚线边框中心透明的图标)。经过各种方式研究,现在做出总结。
代码是公司的,github就不放出来了
其实对于静态库的源码断点调试可以有三种方式:
一、如果工程中有可执行文件,可以直接调试源码,例如ffmpeg的ffmpeg_g可执行文件,缺点是与项目脱离,无法从iOS项目中直接进入(也可能是我没找到方法,反正我是没成功)。无法暂停项目的调试真的很难排查问题在哪。本文不讨论该方法
二、make生成有符号表的静态库文件,项目A引用该文件,并将静态库源码直接拉入工程。通过xcode断点调试。该方法可行,但是不知道ffmpeg为什么不可以,通过nm命令查看符号表,也都正常。但就是不行。然后我选择了第三种方式
三、直接源码调试,就是新建xcode 的静态库工程,然后生成静态库后由A引用,并在A工程中拉入ffmpeg的源码,利用xcode设置断点。实测可以,缺点就是编译ffmpeg时候会有很多奇怪的问题,需要一一解决。我最后采用的就是这种方式。
针对第三种方法,这种其实在逻辑上是最简单的,首先需要新建一个xcode工程,因为是我的是iOS项目,所以我选的是 static library。把ffmpeg的文件夹拉入工程,然后清空compile sources 后面会告诉你哪些需要拖入这个地方,这个工程编译成功后就是.a静态库。然后在build configuration中设置为debug 。别忘了在header search中配置好路径,不然会找不到文件,这里很简单,我就不赘述了,不会的可以去百度。
因为ffmpeg是有多个静态库的,建议一个target对应一个静态库,方便管理和编译,后面往项目A里也只需要拉动ffmpeg的哪个.xcodeproj 文件就行了。也很方便。最后弄好的工程界面应该是这样
那么ffmpeg那么多文件,哪些文件是需要编译的,这才是本文的重点。通常从ffmpeg官方库中下载的源代码,会有一个可执行文件configure,该文件的主要作用是生成一个可以用来make编译ffmpeg的config.h文件,这个config才是最重要的,它里面写了你所需要的配置需要编译哪些文件。他长这样

其实就是一堆宏定义。那么光看他怎么知道哪些文件是需要的还是不够的,你还需要看对应静态库源码文件夹内的makefile文件,因为ffmpeg是通过make编译,而make就是通过config和makefile文件结合来排查那些文件编译的,你需要把make编了哪些文件找到。举个例子,比如我现在想编译libavutil.a这个库,那么你就需要打开libavutil的目录下的makefile文件。见下图
这就很明显了,headers 后面的所有.h文件就是编译静态库后那个Headers文件夹里所有头文件,那么就要把对应的文件拖入这里
这样就会在生成静态库时生成header文件夹了
对于.c文件的编译要在ffmpeg的makefile中找 objs 这个变量里有哪些文件,这里每个.o就是对应.c文件编译过来的,可以假装.o就是.c。

那你会注意到,后面还有很多这样的代码,

这里就是和config联动的地方,我红色框出来的内容,实际上就是config的宏定义,在config中对应的是0或者1,如果是1,那么该行后面的出现的文件名就是要编译的,如果是0,那么就是不需要的。将上面所有需要的.c文件都拖入到这里,注意,别拖错target了
好有就是,根据不同的平台要拖入对应的平台文件,我是iOS项目,也就是arm64,要把汇编文件拖进去,也就是.s文件,其他的该目录下的.c一般不需要。
此时就可以 command + b 编译了。但是会有很多报错,我说一下我遇见的
如果下图报错,那么说明你把不该编译的编译进来了,例如这个tx_template.c,去掉就可以了,注意,不是删除文件啊,文件还在,只是不编译了。

如果类似出现No matching function for call to 'av_pix_fmt_desc_get' 就是缺少头文件,查一下av_pix_fmt_desc_get 函数在哪个.h文件里,一般都是internal.h 在上面添加#include""就行了,如果已经添加了还是报错,那就说明没编译,要把有av_pix_fmt_desc_get 对应的.c文件放入complie sources里。
对于编译其他库时候,也会需要用到libavutil的internal.h,加入把这个写进去就行了#include "libavutil/internal.h",注意head search目录,得让他找得到
对于libavformat,如果你引用了openssl 或者srt,那么你还得添加依赖到link binary中并在library search配置好目录就行了。
对于avutil 源码编译时,ffmpeg有自己的time.h 和time.c文件,xcode会有可能出现于系统库里的time.c和time.h冲突,导致报错,例如 struct tm 、clock()、nanosleep无法找到,但是头文件#include <time.h>明明添加了,这就说明冲突了,给ffmpeg 的time.c和time.h改名就行了。
如果编译成功了,那么恭喜你,完成了一大半。现在你可以在A中引入生成的静态库了,然后编译A,如果报错 Undefined symbol: _av_gettime 说明 av_gettime这函数、变量或者宏定义没找到,你在ffmpeg中找到这个函数所在的.c文件,然后拖到complie sources里,重新编译就行了

上诉问题解决了,大概率就能用了,这时A工程的workspace中拖入ffmpeg的.xcodeproj文件,然后在对应的位置设置断点就可以直接使用了。
从iOS Ademo 启动,断点停在ffmpeg源码如下图

相关文章:
xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。
先阐述一下我的业务场景,我有一个iOS的app sdk项目,下面简称 A ,以及运行 A 的 app 项目,简称 A demo 。 引用关系为 A demo 引用了 A ,而 A 引用了 ffmpeg 的静态库(.a文件)。此时业务出现了 b…...
机器学习06 数据准备-(利用 scikit-learn基于Pima Indian数据集作 数据特征选定)
什么是数据特征选定? 数据特征选定(Feature Selection)是指从原始数据中选择最相关、最有用的特征,用于构建机器学习模型。特征选定是机器学习流程中非常重要的一步,它直接影响模型的性能和泛化能力。通过选择最重要的特征&#…...
机器学习-特征选择:如何使用Lassco回归精确选择最佳特征?
一、引言 特征选择在机器学习领域中扮演着至关重要的角色,它能够从原始数据中选择最具信息量的特征,提高模型性能、减少过拟合,并加快模型训练和预测的速度。在大规模数据集和高维数据中,特征选择尤为重要,因为不必要的…...
SpringBoot之Actuator基本使用
SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…...
排序算法(一)
1.冒泡排序-Bubble Sort 1.算法原理 依次比较相邻的两个元素,若按照从小到大的顺序,则将相邻元素中较大的一个放在后面;然后对每一对相邻元素都做这种比较,序列的最后一个元素就是最大的数; 2.算法复杂度 时间复杂度…...
Centos虚拟机忘记密码-修改密码
1.重启系统 2.在这个选择界面,按e建 3.找到如下位置,插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…...
Shell 分析服务器日志常用命令
1、查看有多少个IP访问: 日志文件的第一列是IP地址 awk {print $1} log_file|sort|uniq|wc -l2、查看某一个页面被访问的次数: grep "/index.php" log_file | wc -l3、查看每一个IP访问了多少个页面: awk {S[$1]} END {for (a i…...
mysql8配置binlog日志skip-log-bin,开启、关闭binlog,清理binlog日志文件
1.概要说明 binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架…...
机器学习:训练集与测试集分割train_test_split
1 引言 在使用机器学习训练模型算法的过程中,为提高模型的泛化能力、防止过拟合等目的,需要将整体数据划分为训练集和测试集两部分,训练集用于模型训练,测试集用于模型的验证。此时,使用train_test_split函数可便捷高…...
淘宝API开发(一)简单介绍淘宝API功能接口作用
前一阵子按照上级指示,根据淘宝API开发符合自已应用的系统,比如批量上传,批量修改名称,价格等功能什么的,在此就将我的开发历程写一写,为自己前段时间的工作做个总结。 淘宝开发平台(淘宝网 - 淘ÿ…...
Redis相关面试题
Redis的使用场景 根据自己简历上的业务进行回答 缓存 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略 分布式锁 setnx redisson 缓存穿透:查询一个不存在的数据,数据库查不到数据也不会直接写入缓存,就会导致每次请求都查询数据库…...
数据库简介
1、数据库安装: rpm (redhat package manager) 也是个包管理工具: rpm -ivh 安装 rpm -e 表示卸载,卸载的时候有可能出现依赖的问题,可以用 --nodeps 忽略依赖卸载。 rpm -qa 搜索系统中安装的rpm的应用。 如果使用离线包,安装顺序不要乱。 m…...
腾讯云国际轻量应用服务器怎么使用呢?
腾讯云国际轻量应用服务器怎么使用呢?下面一起来了解一下: 1. 熟悉轻量应用服务器基础知识 ①什么是轻量应用服务器 TencentCloud Lighthouse? ②轻量应用服务器与云服务器 CVM 的区别是什么? ③为什么选择轻量应用服务器…...
arm环境cloudstack在vpc下创建虚拟机失败
一、环境说明 操作系统:openEuler 22.03CPU:Kunpeng-920,arm v8cloudstack:4.18libvirtd:6.2.0 二、问题描述 在UI上创建VPC后,平台会同时创建一个virtual router,此时virtual router有两个网…...
Linux上安装Keepalived,多台Nginx配置Keepalived(保姆级教程)
目录 一、yum安装 第一步:下载 第二步:编辑Keepalived配置文件(第一台) 第三步:编辑Keepalived配置文件(第二台) 第四步:我们在本机利用cmd ping一下 一、yum安装 第一步&…...
centos7 ‘xxx‘ is not in the sudoers file...
如题 执行命令输入密码后时报错: [sudo] password for admin (我的账户)原因,当前用户还没有加入到root的配置文件中。 解决 vim打开配置文件,如下: #切换到root用户 su #编辑配置文件 vim /etc/sudoe…...
Zebec Payroll :计划推出 WageLink On-Demand Pay,进军薪酬发放领域
“Zebec Protocol 生态旨以 Web3 的方式建立全新的公平秩序,基于其流支付体系构建的薪酬支付板块,就是解决问题的一把利刃”...
【2023】字节跳动 10 日心动计划——第三关
目录 1. 最长有效括号2. 有序数组的平方 1. 最长有效括号 🔗 原题链接:32. 最长有效括号 类似于有效的括号,考虑用栈来解决。 具体来讲,我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」&…...
【无网络】win10更新后无法联网,有线无线都无法连接,且打开网络与Internet闪退
win10更新后无法联网,有线无线都无法连接,且打开网络与Internet闪退 法1 重新配置网络法2 更新驱动法3 修改注册表编辑器法4 重装系统 自从昨晚点了更新与重启后,今天电脑就再也不听话了,变着花样地连不上网。 检查路由器…...
HTML <script> 标签
实例 在 HTML 页面中插入一段 JavaScript: <script type="text/javascript"> document.write("Hello World!") </script>(在本页底部可以找到更多实例) 定义和用法 <script> 标签用于定义客户端脚本,比如 JavaScript。 script …...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
