Skip to content

调试方法

chenk edited this page Jun 7, 2018 · 2 revisions

常用的调试方法

  • 设置断点
  • 单步跟踪
  • 设置监视变量
  • 输出 log

fanplayer 的大部分代码,都是在 vs2005 环境下编写和调试的。linux 环境下有 gdb 这样的调试工具,限于个人没法熟练使用 gdb,所以选择了在 vs2005 环境下进行调试。vs2005 环境下可以方便的进行断点设置、单步跟踪、查看监视变量等操作。

另外一个重要的调试手段,就是输出 debug log。这个手段是非常重要的,甚至是必须的,特别是在调试多线程代码时,log 的输出,可以很快帮助我们定位多线程同步方面的问题。通过 log,我们也可以实时监测程序的运行状态,比如实时的 pts 信息、音视频同步状态、播放器状态,等等。

在 fanplayer 中,我们使用了 ffmpeg 所定义的 av_log 函数进行 log 输出。使用 av_log,需要我们实现如下的接口:

static void fanplayer_log_callback(void* ptr, int level, const char *fmt, va_list vl) {
    if (level <= av_log_get_level()) {
        char str[1024];
        vsprintf_s(str, 1024, fmt, vl);
        OutputDebugStringA(str);
    }
}

void* player_open(char *file, void *win)
{
    ...
    // setup log
    av_log_set_level(AV_LOG_WARNING);
    av_log_set_callback(fanplayer_log_callback);
    ...
}

这样,我们就可以在编写代码的时候,使用 av_log 输出 log 信息了。使用 av_log 的好处,就在于不用自己编写专门的 log 输出模块,同时能够与 ffmpeg 本身的 log 输出保持一致。

ffmpeg 内部也是使用的 av_log 进行 log 输出,我们可以通过 av_log_set_level 来设置需要查看的 log 信息等级。这个对我们很重要,有些时候,我们调用了 ffmpeg 的接口函数,却得到了不正确的返回值,但是我们又不知道时什么原因导致。这时候,我们可以将 log level 设置为 AV_LOG_TRACE。这样程序执行的时候,会提供更多的 log 信息,帮助我们分析和解决问题。

Clone this wiki locally