-
Notifications
You must be signed in to change notification settings - Fork 163
调试方法
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 信息,帮助我们分析和解决问题。
fanplayer wiki