文章目录

  • 前言
  • 如何理解 dump?
  • 1、为什么要 dump(dump的目的)?
  • 2、dump 转储的是什么内容(dump 的对象)?
  • 3. 实际运用


前言

dump 常用在软件开发中及测试中经常用到,下面就 dump 的理解和 Android 中的实际运用做一个小结

如何理解 dump?

在计算机领域,dump 一般译作转储。即使翻译的很贴切,但还是很难从字面上完全理解 dump 的真正含义。

dump 有动词和名词两种场景,作为动词,可以从 dump 的目的和 dump 的对象,这两个方面去理解 dump 本身。

1、为什么要 dump(dump的目的)?

因为程序在计算机中运行时,在内存、CPU、I/O等设备上的数据都是动态的(或者说是易失的),也就是说数据使用完或者发生异常就会丢掉。如果我想得到某些时刻的数据(有可能是调试程序 Bug 或者收集某些信息),就要把他转储(dump)为静态(如文件)的形式。否则,这些数据你永远都拿不到。

2、dump 转储的是什么内容(dump 的对象)?

其实上边已经提到了,就是将动态(易失)的数据,保存为静态的数据(持久数据)。
像程序这种本来就保存在存储介质(如硬盘)中的数据,也就没有必要 dump。

现在,dump 作为名词也很好理解了,一般就是指 dump (动词)的结果文件。

常出现 dump 的场景:
Unix/Linux 中的 coredump,
Java 中的 headdump 和 threaddump,
还有 tcpdump 工具。

3. 实际运用

在 Android Audio 开发中, 添加一个 dump 的开关

AudioFlinger::ThreadBase::TrackBase::~TrackBase(){
    #ifdef ENABLE_AUDIODUMP
    char value[MAX];
    int dumpEnable = 0;
    (void) property_get("audioflinger.dump.test", value, "1");
    dumpEnable = atoi(value);
    if(dumpEnable ==1) {
        FILE* faudioDump;
        char filename[512];
        snprintf(filename, sizeof(filename), "/data/misc/service/tx_track_sid%d_s%d_c%d_f0x%x.pcm", mSessionId, mSampleRate, mChannelCount, mFormat);

        faudioDump = fopen(filename,"ab");
        if(faudioDump != NULL) {
            fwrite(buffer->raw, 1, buffer->frameCount*mFrameSize, faudioDump);
            fclose(faudioDump);
        }
        else {
            ALOGE("can not to open file: %s", filename);
        }
    }
    #endif
}

Android.bp中添加

cflags: [
        "-DENABLE_AUDIODUMP=1",
    ],

如何使用:

adb shell setprop audioflinger.dump.test 1

之后就可以在 data/misc/service 下查看相应的 dump 文件。