使用Xcode调试FFmpeg内部代码

Posted vonchenchen1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Xcode调试FFmpeg内部代码相关的知识,希望对你有一定的参考价值。

分享一下Xcode调试FFmpeg的方法。

1.配置configure文件

首先需要配置configure生成Makefile,Makefile成功生成后再使用Xcode的External Build System执行make命令,这些操作和使用命令行编译是一样的。需要注意的是ffmpeg默认configure会去掉调试符号和进行编译优化,这样会导致debug进入的时候没办法看到每个变量的值,通过执行帮助命令

./configure -h

目前最新的FFmpeg可以看到下面两个选项

这里需要手动指定,下面是我自己的Mac下的configure命令

./configure --prefix=$BASE_PATH/build/ffmpeg_build \\
            --enable-debug=3 \\
            --disable-optimizations \\
            --disable-stripping \\
            --enable-yasm  \\
            --enable-gpl \\
            --enable-pthreads

这样生成Makefile即可。

2.导入Xcode的External Build System

新建一个target,选择下面的External Build System,这里专门用于执行外部编译工具的命令编译。由Makefile管理的这种C/C++工程都可以使用这个。

 点击next输入target名字后保存即可。可以看到一个红色圆圈圈的target,就是上一步创建的结果,如下图。

这时可以先在生成的Makefile目录(也就是FFmpeg的主目录)下先 make clean一下,然后执行刚才创建的ffmpeg-xcode,这时正常应该是通过Xcode执行make命令,重新执行Makefile。

3.执行fftool中的可执行文件

编译完毕后就可以执行或者调试ffmpeg、ffplay、ffprobe这三个程序了。

首先还是建一个控制台程序,建完后删除自动生成的main文件,如下

 

 下一步就是把Makefile生成的ffmpeg_g设置给这个target。也就是说这个target我们不写代码,而是通过schema设置一个生成好的可执行文件给target。

 

在文件中找到刚才执行make生成好的可执行文件,注意需要选择后缀为_g的。

 

 到这一步就可以给ffmpeg在schema中输入参数,进行源码调试了。下面随便给ffmpeg输入一个264文件。

 进入断点

 4.xcode查看FFmpeg源码

现在可以调试代码了,还有一个问题,如何直接在Xcode中查看整个工程的源码。这里我一直没有找到特别靠谱的办法,使用一个比较临时的方法。先建一个控制台target,然后把FFmpeg源码目录拖入Xcode,如下

 随后会弹出对话框,第一步不要选择外部编译,如下

 下一步直接把这些代码关联到刚才新建的target

 然后编译一波,这样虽然编译不过,但是代码跳转正常。

5.自己代码调用FFmpeg库调试

上文完成了fftools中三个应用的调试设置,下面看一下自己调用库调试的方法。

还是建一个控制台程序。首先需要把生成静态库的路径以及头文件路径设置好。 

下一步需要导入Mac本地的链接库,可以一边编译,看缺什么符号再添加,这里贴一下需要的最基本的库,如果遇到找不到符号需要调整一下。

 对于ffplay,由于其依赖SDL,需要更多的库,下面贴出我用到的,如果编译缺东西可以在这个基础上调整。

 下面可以在新建target中加入一段测试代码,尝试运行

#include <iostream>
#include <unistd.h>

extern "C"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"


int main(int argc, const char * argv[]) 
    
    AVFormatContext *format_context;
    
    av_log_set_level(AV_LOG_VERBOSE);
    
    format_context = avformat_alloc_context();
    avformat_open_input(&format_context, "xxx/mac_build/Debug/out.h264", nullptr, nullptr);
    avformat_find_stream_info(format_context, nullptr);
    
    av_dump_format(format_context, 0, 0, 0);
    
    while (true) 
        sleep(1);
    
    
    return 0;

 这里存在一个问题,在FFmpeg内部执行断点时点击continue后面的断点无法停止,不知道什么原因,希望了解的朋友可以指点一下,目前这里我使用命令行进行操作,手动打断点,然后用c命令执行。

b xxxx.c:1234
c

以上是关于使用Xcode调试FFmpeg内部代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 中调试内部类

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体

Xcode 10.2:调试应用程序时出现内部错误